Когда я присутствовал на собеседовании, интервьюер задал мне этот вопрос. В какой памяти они используют кучу, стек и т. Д. Я искал ее, но я не получил четкого ответа.
Значения $_POST
внутри создаются внутри php_auto_globals_create_post()
и доступны через PG(http_globals)[TRACK_VARS_POST]
, что является лишь способом ссылки на http_globals
.
Определение вышеупомянутых http_globals
говорит нам, что это массив элементов zval *
, по одному для каждого $_POST
, $_GET
, $_COOKIE
и т. Д. (Массивы также хранятся внутри контейнера zval
).
Выделение zval
выполняется через ALLOC_ZVAL()
, который вызывает следующие функции:
_emalloc()
_malloc()
Функция malloc()
выделяет память в куче, поэтому ответ является кучей .
Ну, так как вы отметили C
, я начну с этого.
В среде выполнения C глобальные переменные хранятся в одном из двух мест; сегмент данных или сегмент BSS. То, как вы определяете, к какой конкретной переменной относится, является ли она инициализирована или нет.
Инициализированные глобальные (и статические) переменные входят в сегмент данных .
Неинициализированные глобальные (и статические) переменные входят в сегмент BSS .
Визуально все время выполнения выглядит так:
_______ | Text | |_______| | Data | <-- Initialized globals / statics |_______| | BSS | <-- Uninitialized globals / statics (basically a bunch of 0s) |_______| | | | Stack | |_______| | | | Heap | |_______|
В отличие от переменных в стеке и кучи , которые создаются во время выполнения, глобальные переменные существуют как часть исполняемого файла образа вашей программы ( a.out
, foobar.exe
).