2011-06-17 138 views
40

編譯器(例如GCC)如何分配conststatic const變量,如在哪裏駐留?在數據存儲器或程序存儲器中?Const vs Static Const

回答

38

這取決於你的系統,以及你如何使用變量。對於static變量:

案例1:您從不使用該變量,並且編譯器會自動丟棄它。這與extern變量不會發生。

案例2:您使用該變量,但您永遠不會收到它的地址。編譯器將該變量的使用轉換爲立即操作數,就像它是#defineenum一樣。編譯器仍然可以將extern靜態轉換爲立即操作數,但它仍然必須爲其找到地址。

案例3:您使用該變量並取其地址,編譯器被迫找到一個地方將其放入目標代碼中,就好像它是extern一樣。

至於「數據」與「程序」內存,那麼,這是非常特定於您正在使用的系統。在我的Linux x64/ELF系統上,它可能會被放入.rodata部分,該部分與代碼(.text)位於同一個段中,但與讀寫數據段(.bss,.data)不同。我的系統似乎不會爲只讀不可執行數據創建單獨的段。

附錄:請注意,C++中的行爲不同。在C++中,默認情況下,const變量具有內部鏈接,因此static const是冗餘的,extern const對於通過外部鏈接獲取常量是必需的。

5

迪特里希已經很好地解釋了static變量的情況。

對於局部變量,編譯器實現有多個選擇,以便在哪裏分配const限定了該地址的限定變量。它可能會或可能不會被分配在堆棧或靜態內存中。 const合格的複合文字尤其如此。在不同範圍內本地聲明的兩個這樣的文字的地址可以被合併爲一個,並且它們的地址可以相等。