Показать сообщение отдельно
Старый 28.09.2013, 08:08   #6
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: Странное поведение массива...

С уровня абстракции языка так оно и есть, но в памяти интерпретатора оба массива будут храниться как один. Но как только ты в один из массивов добавишь новый элемент, интерпретатор сразу создаст копию массива для второй переменной и только тогда добавит туда новый элемент.

Например, нужно написать функцию, которая будет получать массив чисел и возвращать сумму всех этих чисел. Причём мы планируем использовать функцию для очень больших массивов, занимающих много оперативной памяти.

Сначала программист напишет так:
function ololoSum($array){
  
$sum=0;
  
$length=count($array);
  for(
$i=0;$i<$length;$i++){
    
$sum+=$array[$i];
  }
  return 
$sum;

Потом прочитает в мануале:
Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы скопировать массив по ссылке, вам нужно использовать оператор ссылки.
И перепишет так (чтобы массив в функцию передавался по ссылке):
function ololoSum(&$array){
  
$sum=0;
  
$length=count($array);
  for(
$i=0;$i<$length;$i++){
    
$sum+=$array[$i];
  }
  return 
$sum;

Программист будет думать, что при передаче массива в первый вариант функции будет создана копия массива (мы же не по ссылке передаём и имеем дело с локальной копией массива) и на момент вызова функции вместо 100500 килобайт занятой оперативы у нас получится 100500*2. Нихера не так. Под локальную копию массива не будет выделена новая память на содержимое массива. Вместо этого интерпретатор внутри себя будет ссылаться на ту же самую память глобально созданного массива. То есть на деле оба варианта функции будут работать примерно одинаково и не приведут к излишнему расходу памяти. Но если внутри первой функции мы напишем в каком-то месте, например, $array[0]=0; , то в этом месте интерпретатор создаст полную копию массива и только тогда изменит в нём нулевую ячейку. Вот тогда выделение памяти будет 100500*2.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Phantom за это полезное сообщение:
moka (29.09.2013), pax (28.09.2013), Черный крыс (28.09.2013)