Подтвердить что ты не робот

Почему целочисленное значение занимает 72 байта памяти?

Возможный дубликат:
Что такое накладные расходы на использование PHP int?

Может кто-нибудь объяснить мне, почему создание целого числа в PHP, стоит 72 байта?

var_dump(memory_get_usage()); //49248 bytes  
$a = 255;  
var_dump(memory_get_usage()); // 49320 bytes
4b9b3361

Ответ 1

Вероятно, это связано с тем, как PHP выделяет память. Файлы не скомпилированы в двоичные файлы, поэтому они не нажимают четыре байта на стек или не выделяются в куче, а выделяют память в виртуальном стеке.

Ответ 2

У меня нет обширных знаний о внутренних функциях PHP, но концепция заключается в том, что при создании переменной с целочисленным значением PHP внутренне выделяет структуру (такие структуры обычно называются вариантами), которая может содержать любой тип значение на языке (включая типы объектов, функции и т.д.). Это обязано требовать более 4 байтов.

С этой точки зрения остается вопрос, почему 72 (а не, например, 42)? Для ответа на этот вопрос нам нужно исследовать не только источник C (чтобы точно определить, что выделено, и каков его объем памяти), но и реализация memory_get_usage (чтобы увидеть, как именно он учитывает использование памяти).

Обновление: Я чувствую, что мне нужно больше внимания уделять тому, как он учитывает использование памяти.

Вполне возможно, что выделение новой переменной заставляет распределитель памяти PHP резервировать блок памяти из кучи C, существенно превышающий то, что ему нужно для удовлетворения запроса на распределение переменных (он также может решить сохранить эту память в будущем используйте даже после того, как вы, например, unset переменная).

Если memory_get_usage хочет считать весь блок памяти "использованным", тогда вы даже можете увидеть простую целочисленную переменную, которая приведет к увеличению использования, скажем, 1K (если все было так просто, как я описал до сих пор, дополнительное целочисленное распределение не приведет к увеличению использования памяти.)

Моя точка зрения заключается в том, что вы не можете вызвать неожиданные результаты использования памяти, пока не сможете полностью определить, каковы ожидаемые результаты. И это невозможно, не глядя на источник для memory_get_usage.

Ответ 3

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

$a = 100;
//...then later in the code
$a = 100000;
//or
$b = "hello";
//...then later in the code
$b = "hello world this is a long string to show how long a string can be.";

Это также может быть связано с тем, что PHP является языком предварительной обработки, а не программой, которая преобразует ваш код в двоичный код, тогда выполняется двоичный код.