¿Dónde se almacenan variables globales como $ _GLOBAL, $ _POST, etc.?

Cuando asistí a una entrevista, el entrevistador me hizo esta pregunta. Qué memoria están usando montón, stack, etc. Lo busqué en Google, pero no obtuve ninguna respuesta clara.

Los valores de $_POST internamente se crean dentro de php_auto_globals_create_post() y están disponibles a través de PG(http_globals)[TRACK_VARS_POST] , que es solo una forma de referenciar http_globals .

La definición de http_globals antes mencionada nos dice que se trata de una matriz de elementos zval * , uno por cada $_POST , $_GET , $_COOKIE , etc. (los arrays también se almacenan dentro de un contenedor zval ).

La asignación de un zval se realiza a través de ALLOC_ZVAL() , que llama a las siguientes funciones:

  1. _emalloc()
  2. _malloc()

La función malloc() asigna memoria en el montón, por lo tanto, la respuesta es montón .

Bueno, ya que etiquetó C , comenzaré con eso.

En el tiempo de ejecución de C, las variables globales se almacenan en uno de dos lugares; el segmento de datos o el segmento BSS. La manera de determinar a qué pertenece una variable en particular es si se inicializa o no.

Las variables globales (y estáticas) inicializadas van dentro del segmento de datos .

Las variables globales (y estáticas) no inicializadas van dentro del segmento BSS .

Visualmente, todo el tiempo de ejecución se ve así:

  _______ | Text | |_______| | Data | <-- Initialized globals / statics |_______| | BSS | <-- Uninitialized globals / statics (basically a bunch of 0s) |_______| | | | Stack | |_______| | | | Heap | |_______| 

A diferencia de las variables en la stack y el montón , que se crean en el tiempo de ejecución, las variables globales existen como parte del archivo de imagen ejecutable de su progtwig ( a.out , foobar.exe ).