考慮下面的代碼:全局變量(存儲器綁定)
#include<stdio.h>
int a=0;
int main()
{
//some code
}
我瞭解到,物理內存靜態變量的結合是在加載時進行。 何時完成'a'的內存綁定?它存儲在哪裏,在堆棧區域還是靜態區域?
考慮下面的代碼:全局變量(存儲器綁定)
#include<stdio.h>
int a=0;
int main()
{
//some code
}
我瞭解到,物理內存靜態變量的結合是在加載時進行。 何時完成'a'的內存綁定?它存儲在哪裏,在堆棧區域還是靜態區域?
a
是靜態存儲,因爲它是全球。只有本地函數的變量位於堆棧上。
您可以在函數中使用static
關鍵字來使該變量的存儲類型也是靜態的。但是,全局變量上的static
具有不同的含義(因爲它們已經是靜態存儲類型):變量的符號不會被導出到對象文件,因此該變量將不能直接從其他模塊訪問(。 c文件)。
雖然這是最常見的行爲,但這不是強制性的。編譯器/平臺在存儲方面可以自由地做任何事情。 –
正如已經指出的那樣,一般行爲是依賴於平臺的,因此沒有普遍有效的答案,但是在大多數現代的「正常」系統中,會發生什麼情況是編譯器在生成的目標文件中生成一個.data
部分,包含您定義的變量的初始化值。
當您啓動程序時,程序加載程序將內存映射到可執行文件的.data
部分到新創建的進程的虛擬內存中,可供您的程序讀取和寫入(可能使用一些COW計劃,以保持每個進程的複製私人)。
您使用的術語「內存綁定」不是正常術語的一部分,所以我不確切地知道你在問什麼,但這可能有幫助嗎?
編譯時,編譯器知道「a」是全局變量,並將「a」放入可執行文件的數據部分。在該區域中,可執行文件記錄「a」的虛擬地址。當可執行文件加載到操作系統中運行時,並且在運行期間使用「a」時,操作系統會將物理地址映射到「a」的虛擬地址。可執行文件的其餘代碼只需要知道「a」的虛擬地址就可以訪問它,操作系統將執行映射並進入物理內存進行讀寫操作。編譯期間編譯器確定「a」的虛擬地址。
欲瞭解更多的知識,本書「計算機系統:程序員的視角」是一個很好的來源。
這是平臺相關的。 –
@奧利查爾斯沃斯你可以給一個直覺,爲什麼這樣呢? – ishan3243
由於內存,變量等的排列不是由C語言定義的。 –