全局变量如$ _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()
,它调用以下函数:
-
_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
)的一部分存在。