全局变量如$ _GLOBAL,$ _POST等存储在哪里?

当我参加面试时,面试官问我这个问题。 他们正在使用堆,堆栈等内存。我用Google搜索但我没有得到任何明确的答案。

内部$_POST的值在php_auto_globals_create_post()中创建,并通过PG(http_globals)[TRACK_VARS_POST] ,这只是一种引用http_globals

上述http_globals的定义告诉我们它是一个zval *元素数组,每个$_POST$_GET$_COOKIE等一个(数组也存储在zval容器中)。

分配zval是通过ALLOC_ZVAL() ,它调用以下函数:

  1. _emalloc()
  2. _malloc()

malloc()函数在堆上分配内存,因此答案是

好吧,既然你标记了C ,我就会从那开始。

在C运行时,全局变量存储在两个位置之一; 数据段或BSS段。 确定特定变量属于哪一个的方式是它是否已初始化。

初始化的全局(和静态)变量进入数据段

未初始化的全局(和静态)变量进入BSS段

在视觉上,整个运行时看起来像这样:

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

与在运行时创建的堆栈堆上的变量不同,全局变量作为程序的可执行映像文件( a.outfoobar.exe )的一部分存在。