2013-10-21 72 views
5

當我參加面試時,面試官問我這個問題。他們正在使用堆,堆棧等內存。我使用了它,但我沒有得到任何明確的答案。

+0

你知道堆棧/堆是什麼嗎?我會從那裏開始。你是否確定他們知道他們在說什麼? – PeeHaa

+0

這個問題只有在你打算作爲一個PHP核心開發者工作時纔有意義,但是在這種情況下,這個問題也應該用'C'來標記... – feeela

+1

我從來沒有聽說過任何人關心內存管理在PHP中(而不是開發PHP本身)...看看Zend內存管理器 – Basic

回答

5

$_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()函數在堆上分配內存,因此,因此答案爲

+0

傑克我現在越來越困惑,因爲PHP是在C開發的@KepaniHaole告訴將是正確的嗎? – Pramod

+1

@Pramod他指的是C本身的全局變量;我指的是如何存儲PHP *中的全局變量*。 –

+0

好的,謝謝了。 – Pramod

7

那麼,既然你標記了C,我會從那開始。

在C運行時,全局變量存儲在兩個地方之一;數據段或BSS段。 確定某個變量屬於哪一個的方式是它是否被初始化。

初始化全局(靜態)變量去數據段內。

未初始化全局(靜態)變量去 BSS段內。

從外觀上看,整個運行時間如下:

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

不像堆棧變量,這是在運行時創建,全局變量的一部分而存在的程序的可執行映像文件(a.outfoobar.exe)。

+0

謝謝,現在我對此有所瞭解。但我仍然懷疑像他們在PHP管理.. – Pramod