выделение памяти

col

Новичок
выделение памяти

Вопросы собственно в комментах.
Если кто знает поделитесь ссылками желательно на русском, как вообще устроенно там всё в нутрЕ.
Помнится Тони высказывался по этой теме но вскользь, хотелось бы более полноценно.

PHP 5.2.5
Windows XP SP2

PHP:
<?
$s = str_pad('', 1033999 );
echo "mc1=".(memory_get_usage()/1024/1024)."\n";
echo "mm1=".(memory_get_peak_usage()/1024/1024)."\n";
$a = &$s;
echo "mc2=".(memory_get_usage()/1024/1024)."\n";
echo "mm2=".(memory_get_peak_usage()/1024/1024)."\n\n";

$s = str_pad('', 1033999 ); // почему вот здесь используется 2 метра памяти, хотя генерируется и присваевается 1 ? 
echo "mc3=".(memory_get_usage()/1024/1024)."\n";
echo "mm3=".(memory_get_peak_usage()/1024/1024)."\n";
$b = &$s;
echo "mc4=".(memory_get_usage()/1024/1024)."\n";
echo "mm4=".(memory_get_peak_usage()/1024/1024)."\n\n";
/*
mc1=1.0476989746094
mm1=1.0477294921875
mc2=1.0477752685547
mm2=1.0477752685547

mc3=1.0477981567383
mm3=3.0200119018555
mc4=1.0478439331055
mm4=3.0200119018555
*/
?>
PHP:
<?
function a($a) {
	// почему здесь 3 метра в памяти, а не два?
	echo "mc2=".(memory_get_usage()/1024/1024)."\n";
	echo "mm2=".(memory_get_peak_usage()/1024/1024)."\n";
	$b = $a."";
	echo "mc3=".(memory_get_usage()/1024/1024)."\n";
	echo "mm3=".(memory_get_peak_usage()/1024/1024)."\n\n";
}

$s = str_pad('', 1033999 );
echo "mc1=".(memory_get_usage()/1024/1024)."\n";
echo "mm1=".(memory_get_peak_usage()/1024/1024)."\n\n";
a($s."");
echo "mc4=".(memory_get_usage()/1024/1024)."\n";
echo "mm4=".(memory_get_peak_usage()/1024/1024)."\n\n";
/*
mc1=1.0486755371094
mm1=1.0487060546875

mc2=3.0216674804688
mm2=3.0216674804688
mc3=4.0078430175781
mm3=4.0078430175781

mc4=1.0490112304688
mm4=4.0078430175781
*/
?>
PHP:
<?
function a(&$a) {
	// почему здесь 2 метра в памяти, а не 1?
	echo "mc2=".(memory_get_usage()/1024/1024)."\n";
	echo "mm2=".(memory_get_peak_usage()/1024/1024)."\n\n";
}

$s = str_pad('-', 1033999);
echo "mc1=".(memory_get_usage()/1024/1024)."\n";
echo "mm1=".(memory_get_peak_usage()/1024/1024)."\n\n";
a($s);
echo "mc3=".(memory_get_usage()/1024/1024)."\n";
echo "mm3=".(memory_get_peak_usage()/1024/1024)."\n\n";
/*
mc1=1.046516418457
mm1=1.046516418457

mc2=2.0331268310547
mm2=2.0331268310547

mc3=1.0470199584961
mm3=2.0331268310547
*/
?>
 

tony2001

TeaM PHPClub
>$s = str_pad('', 1033999 );
>$a = &$s;
>$s = str_pad('', 1033999 ); // почему вот здесь используется 2 метра памяти, хотя генерируется и присваИвается 1 ?

мы не можем сначала разрушить $s и сразу же присвоить ей результат выполнения str_pad() потому, что это на месте str_pad() может быть что угодно, в том числе и $s[0].

вот такой пример:
Код:
$a = array(1,2,3);
$a = $a[1]; /* надо хранить $a и разрушать его уже после присвоения */
в результате некий промежуток времени существуют сразу 3 переменные:
$a, результат выполнения str_pad() и временная переменная с предыдущим значением $a.
 

col

Новичок
это я читал там полезно мне только одно высказывание Тони
.....переменная была создана как $a = $b, то $a - это на самом деле $b с refcount = 2......


Автор оригинала:tony2001
Спасибо всё оч понятно, а как на счет двух остальных случаев.
 

tony2001

TeaM PHPClub
да то же самое.
по неким причинам создаётся копия переменной.
чтобы сказать точно, надо сесть и протрэйсить каждый шаг.
 

col

Новичок
Я не много поспешил с выводами, на счет всё оч понятно.
вы утверждаете
Автор оригинала: tony2001
мы не можем сначала разрушить $s и сразу же присвоить ей результат выполнения str_pad() потому, что это на месте str_pad() может быть
что угодно, в том числе и $s[0] и поетому в какйто момент времени существуют сразу 3 переменные:
$a, результат выполнения str_pad() и временная переменная с предыдущим значением $a.
я полагаю вы имели ввиду $s, а не $a. Если ошибся поправте, а если не ошибся то.
в следующем примере тоже должен быть скачок в 3 объёма.
$s = str_pad('', 1033999 );
$s = str_pad('', 1033999 );
так ведь ?
ведь в этом случаи мы ТАКЖЕ не можем сначала разрушить $s и сразу же присвоить ей результат выполнения str_pad() потому, что на месте str_pad() может быть что угодно, в том числе и $s[0] и поетому в какйто момент времени должны существовать сразу 3 объёма
str_pad() + $s + временная переменная с предыдущим значением $s.
однако нет !!! в этом месте прыжок по памяти происходит только в 2 раза.

мне кажется тут дело именно в использовании $a = &$s;
Так что вы, что то темните Тонни, давайте как выкладывайте государственные тайны :)


Автор оригинала: tony2001
да то же самое.
по неким причинам создаётся копия переменной.
чтобы сказать точно, надо сесть и протрэйсить каждый шаг.
Вас не очень затруднит проделать сию работу и выложить результаты ?
Т.к. чесно говоря я понятия не имею как это сделать.
 

tony2001

TeaM PHPClub
> я полагаю вы имели ввиду $s, а не $a. Если ошибся поправте, а если не ошибся то.
> следующем примере тоже должен быть скачок в 3 объёма.
> $s = str_pad('', 1033999 );
> $s = str_pad('', 1033999 );

>мне кажется тут дело именно в использовании $a = &$s;

естественно.
если refcount у переменной == 1, то вариант, о котором я говорил, не имеет смысла - нет ссылок, значит можно спокойно убивать.

>Так что вы, что то темните Тонни, давайте как выкладывайте государственные тайны

http://lxr.php.net/source/ZendEngine2/zend_execute.c#734
все "тайны" описаны в исходниках.

-~{}~ 14.03.08 15:29:

>Вас не очень затруднит проделать сию работу и выложить результаты ?
>Т.к. чесно говоря я понятия не имею как это сделать.

затруднит.
мне есть чем занять несколько часов времени.
 
Сверху