Когда я присутствовал на собеседовании, интервьюер задал мне этот вопрос. В какой памяти они используют кучу, стек и т. Д. Я искал ее, но я не получил четкого ответа.
Значения $_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 ).