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

时间:2013-10-21 07:17:38

标签: php c memory-management global-variables

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

从视觉上看,整个运行时如下所示:

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

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

答案 1 :(得分:5)

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

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

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

  1. _emalloc()
  2. _malloc()
  3. malloc()函数在堆上分配内存,因此答案是