6

我去面试的时候,面试官问了我这个问题。他们使用的是堆、堆栈等内存。我用谷歌搜索了它,但没有得到任何明确的答案。

4

2 回答 2

7

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

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

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

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

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

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

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

于 2013-10-21T07:28:43.833 回答
5

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

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

分配 azval是通过 完成ALLOC_ZVAL()的,它调用以下函数:

  1. _emalloc()
  2. _malloc()

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

于 2013-10-21T09:18:02.147 回答