2013-09-28 141 views
0

考慮下面的代碼:全局變量(存儲器綁定)

#include<stdio.h> 
int a=0; 

int main() 
{ 
//some code 
} 

我瞭解到,物理內存靜態變量的結合是在加載時進行。 何時完成'a'的內存綁定?它存儲在哪裏,在堆棧區域還是靜態區域?

+0

這是平臺相關的。 –

+0

@奧利查爾斯沃斯你可以給一個直覺,爲什麼這樣呢? – ishan3243

+0

由於內存,變量等的排列不是由C語言定義的。 –

回答

0

a靜態存儲,因爲它是全球。只有本地函數的變量位於堆棧上。

您可以在函數中使用static關鍵字來使該變量的存儲類型也是靜態的。但是,全局變量上的static具有不同的含義(因爲它們已經是靜態存儲類型):變量的符號不會被導出到對象文件,因此該變量將不能直接從其他模塊訪問(。 c文件)。

+0

雖然這是最常見的行爲,但這不是強制性的。編譯器/平臺在存儲方面可以自由地做任何事情。 –

2

正如已經指出的那樣,一般行爲是依賴於平臺的,因此沒有普遍有效的答案,但是在大多數現代的「正常」系統中,會發生什麼情況是編譯器在生成的目標文件中生成一個.data部分,包含您定義的變量的初始化值。

當您啓動程序時,程序加載程序將內存映射到可執行文件的.data部分到新創建的進程的虛擬內存中,可供您的程序讀取和寫入(可能使用一些COW計劃,以保持每個進程的複製私人)。

您使用的術語「內存綁定」不是正常術語的一部分,所以我不確切地知道你在問什麼,但這可能有幫助嗎?

+0

通過內存綁定我的意思是當一個變量被分配實際物理內存的時間。 – ishan3243

+0

在這種情況下,我認爲我的答案是:在程序加載時。儘管嚴格來說,它當時只被分配了虛擬內存。嚴格來說,現代系統只會在實際上通過觸摸它來分頁時分配物理內存(並且如果您從未寫入但只讀取它,則您的進程可能永遠不會獲得分配的獨佔內存,因爲該部分可能是與其他進程共享)。 – Dolda2000

0

編譯時,編譯器知道「a」是全局變量,並將「a」放入可執行文件的數據部分。在該區域中,可執行文件記錄「a」的虛擬地址。當可執行文件加載到操作系統中運行時,並且在運行期間使用「a」時,操作系統會將物理地址映射到「a」的虛擬地址。可執行文件的其餘代碼只需要知道「a」的虛擬地址就可以訪問它,操作系統將執行映射並進入物理內存進行讀寫操作。編譯期間編譯器確定「a」的虛擬地址。

欲瞭解更多的知識,本書「計算機系統:程序員的視角」是一個很好的來源。