Большой массив в функцию лучше передавать по ссылке?

lantastic

Новичок
Большой массив в функцию лучше передавать по ссылке?

Есть большой массив. Функция использует его для работы, не изменяя его совсем, только использует данные.

Так лучше его передавать по ссылке, как например:

function func(&$arr)
{
...
}
 

Tor

Новичок
а ты знаешь, чем отличается передача по сыылке от передачи по значению?
если знаешь, то ответ на твой вопрос должен быть очевиден
 

lantastic

Новичок
передав по значению, функция работает с локальной копией массива, а передав по ссылке - с тем же самым массивом. чтобы избежать затрат на создание большой копии массива, думаю, стоит передавать по ссылке, так ведь?
 

Tor

Новичок
ты долго еще собираешься спрашивать, будет ли 2+2=4?
 

lantastic

Новичок
ладно, делаю так! но могли бы уж уверить меня, что это действительно верно. тема закрыта :)
 

Profic

just Profic (PHP5 BetaTeam)
абсолютно пофигу (если правда, что "функция использует его для работы, не изменяя его совсем"), т.к. в php применяется принцип COW (copy on write) при передаче переменных, да и при присвоении
 

ssv

Новичок
Автор оригинала: Profic
абсолютно пофигу (если правда, что "функция использует его для работы, не изменяя его совсем"), т.к. в php применяется принцип COW (copy on write) при передаче переменных, да и при присвоении
А можно по подробнее?
ссылку или цитату
ибо я немного не понял, о чем ты говоришь?

вот пример в какой момент происходит "копирование при записи"?

$a = 'test';
foo($a);
functon foo(&$var)
{
$var = 'bla bla bla';
}

с обьектми пример. для 4 ПХП
$oSomeObj = &new SomeClass();
foo($oSomeObj);
class SomeClass
{
var $arr = array();
function assing($var)
{
$this->arr[] = $var;
}
}

functon foo(&$oObj)
{
$oObj->assign( 'bla bla bla');
}
 

white phoenix

Новичок
ssv
PHP:
$first = str_repeat('0',1024*1024);
// использование памяти повысилось на 1 мб с копейками
$second = $first;
// использование памяти на копейки повысилось
$second .= '0';
// использование памяти повысилось на 1 мб с копейками
Т.е. при передаче/присвоении даже без ссылки, значение не копируется, а делается ссылка, а в момент когда мы изменяем значение делая например:
PHP:
$second .= '0';
Происходит копирование и изменение. Это и называется COW (Copy On Write), это сделано в целях экономии памяти.
 
Сверху