編譯器(例如GCC)如何分配const
和static const
變量,如在哪裏駐留?在數據存儲器或程序存儲器中?Const vs Static Const
40
A
回答
38
這取決於你的系統,以及你如何使用變量。對於static
變量:
案例1:您從不使用該變量,並且編譯器會自動丟棄它。這與extern
變量不會發生。
案例2:您使用該變量,但您永遠不會收到它的地址。編譯器將該變量的使用轉換爲立即操作數,就像它是#define
或enum
一樣。編譯器仍然可以將extern
靜態轉換爲立即操作數,但它仍然必須爲其找到地址。
案例3:您使用該變量並取其地址,編譯器被迫找到一個地方將其放入目標代碼中,就好像它是extern
一樣。
至於「數據」與「程序」內存,那麼,這是非常特定於您正在使用的系統。在我的Linux x64/ELF系統上,它可能會被放入.rodata
部分,該部分與代碼(.text
)位於同一個段中,但與讀寫數據段(.bss
,.data
)不同。我的系統似乎不會爲只讀不可執行數據創建單獨的段。
附錄:請注意,C++中的行爲不同。在C++中,默認情況下,const
變量具有內部鏈接,因此static const
是冗餘的,extern const
對於通過外部鏈接獲取常量是必需的。
5
迪特里希已經很好地解釋了static
變量的情況。
對於局部變量,編譯器實現有多個選擇,以便在哪裏分配const
限定了該地址的限定變量。它可能會或可能不會被分配在堆棧或靜態內存中。 const
合格的複合文字尤其如此。在不同範圍內本地聲明的兩個這樣的文字的地址可以被合併爲一個,並且它們的地址可以相等。
相關問題
- 1. static const char * const和static const char []之間有什麼區別?
- 2. static const和const有什麼區別?
- 3. static const std :: vector
- 4. static const arrays
- 5. const vs new const
- 6. static const與extern const不同嗎?
- 7. static const variable as macro
- 8. public static class或const
- 9. const struct {x} vs struct {const x}
- 10. gcc:__DATA,__ const vs __TEXT,__ const
- 11. Const char * vs const wchar_t *(concatenation)
- 12. static const int as map subscript
- 13. static const char地址返回
- 14. C#,使用static和const
- 15. 基類中的const與派生類中的static const
- 16. 哪個更適合:「const」還是「static readonly」?
- 17. func(QWidget * const&Widget)VS func(QWidget * const Widget)
- 18. 「extern const」vs「extern」only
- 19. C++中的static const vs constexpr成員字段11/14?
- 20. 繼承自std :: true_type vs static constexpr const布爾成員
- 21. 「static const」vs「#define」爲了提高效率C
- 22. const vs Func <string>
- 23. Windows C++:LPCTSTR vs const TCHAR
- 24. 鑄造const void * const const *
- 25. 轉const const wchar_t *爲const char *
- 26. VB #const,/ const等
- 27. const CFoo&bar()const
- 28. const char * const char **
- 29. Pascal:Const Const Const
- 30. 爲const char * VS字符*