本地,全局,靜態,自動,寄存器,外部,常量,易失性變量存儲在哪裏?本地,全局,靜態,自動,寄存器,外部,常量,易失性變量存儲在哪裏?
回答
本地變量可以存儲在棧中或在數據段取決於它們是否是自動的或靜態的。 (如果沒有明確指定既不自動或靜態的,假設自動)
全球變量存儲在一個數據段(除非編譯器可以優化他們離開,見常量),並具有從申報點的可視性編譯單元的結尾。
static變量存儲在數據段中(同樣,除非編譯器可以優化它們)並且從聲明點到包含範圍的末尾都具有可見性。非靜態的全局變量在其他編譯單元中也可見(請參見extern)。
auto變量總是本地的,並存儲在堆棧中。
寄存器修飾符告訴編譯器儘可能將變量保存在寄存器中,如果可能的話。否則它將存儲在堆棧中。
extern變量存儲在數據段中。 extern修飾符告訴編譯器,一個不同的編譯單元實際上正在聲明該變量,所以不要創建它的另一個實例,否則會在鏈接時產生名稱衝突。
const變量可以存儲在堆棧或只讀數據段中,具體取決於它們是自動還是靜態。但是,如果編譯器可以確定它們不能從其他編譯單元引用,或者代碼沒有使用const變量的地址,則可以自由優化它(每個引用可以由常量值替換) 。在這種情況下,它不存儲在任何地方。
的揮發性修飾符告訴一個變量的值可以在改變它的編譯器隨時從外部影響(通常是硬件),因此它不應該試圖從存儲器優化掉任何重新加載到寄存器中時變量被引用。這意味着靜態存儲。
順便說一句這一切適用到C & C++以及Objective-C的。
局部變量通常存儲在堆棧中,全局變量存儲在程序的「文本」段(如果是字符串常量)或堆中(如果它們是動態分配的)。自動變量通常用在函數/方法中,通常在堆棧上傳遞(有時在寄存器中也取決於架構)。寄存器變量曾經存儲在寄存器中,但是現在大多數編譯器忽略寄存器關鍵字並將它們放在任何他們認爲合適的地方 - 堆棧或寄存器中。 Extern,const和volatile成員是修飾符,因此它們沒有存儲的明確位置。
所以簡短的回答就像往常一樣,「取決於」。
Local和auto
變量存儲在堆棧中。 Global和static
變量存儲在DATA頁面中。 register
如果可能的話,變量存儲在CPU的寄存器中,否則存儲在堆棧中。 extern
,const
和volatile
不指定變量的存儲位置;該變量存儲在其他存儲說明符所說的地方。
文本段通常只讀。全局變量將位於數據段中。 – JeremyP 2010-09-10 13:59:40
@JeremyP:你是對的,那裏有一個小小的頭腦風暴。 – 2010-09-10 14:10:32
在什麼樣的抽象層次上尋找答案?
在物理層面,它們都可能存儲在柵極電容和磁疇中。 (如果你的交換磁盤是wifi或光纖連接,甚至可能是光子)
在一個硬件級別,任何和所有這些變量的副本可能存在於寄存器,數據緩存(可能是多個級別) ,主內存和/或存儲層次結構,從完全換出到磁盤或NV存儲(取決於任何需求分頁的虛擬內存子系統的存在,實現和當前狀態),甚至可能是寄存器中的所有內容(如果您的應用程序大小而且一生都很小。由於最熟悉的編譯器和運行時實現,內存(也許是虛擬的)被切割成堆棧和堆棧。鑑於正式的語言定義,這種斬波可能或可能不需要。
在編譯器優化級別,許多這些變量可能已經被優化了。除了作爲抽象,它們不會被存儲在任何地方。
+100希望我可以多次投票,以使這個投票答案最多:) – pmg 2010-09-10 18:07:08
我最喜歡抽象部分。 – 2010-09-11 06:54:42
LOCAL-範圍在函數中使用的局部變量。它可以是自動或靜態兩種類型。 如果它被聲明爲簡單int var.Compiler視爲自動存儲類。 自動變量存儲在堆棧中。 靜態變量存儲在數據段中。
寄存器變量存儲在CPU中。如果沒有寄存器可用於存儲變量,則編譯器視爲自動變量。
全局變量存儲在數據段區域中。
const變量存儲在只讀區域,即memeory的代碼段區域。
- 1. 靜態存儲在內存中的全局變量在哪裏?
- 2. .NET局部變量存儲在哪裏?
- 3. FORTRAN在哪裏存儲局部變量?
- 4. 如何知道寄存器變量存儲在哪裏?
- 5. 在哪些內存中存在靜態變量,局部變量是否存在?
- 6. 存儲在內存中的DLL的全局變量在哪裏?
- 7. 哪部分內存是存儲在靜態局部常量中的?
- 8. 變量存儲在哪裏?
- 9. 將局部變量中的動態int值存儲爲靜態?
- 10. 彙編局部變量和寄存器
- 11. 揮發性變量存儲在哪裏?
- 12. 其中是存儲在內存段中的全局變量和靜態變量?
- 13. 靜態全局變量和靜態局部變量
- 14. 在PHP中,全局聲明的變量存儲在哪裏?
- 15. 存儲字節在寄存器變量
- 16. const的揮發,易失性寄存器,靜態揮發在C++
- 17. 哪一部分在C++可執行文件中存儲全局常量變量?
- 18. 全局變量像$ _GLOBAL,$ _POST等存儲在哪裏?
- 19. 變量類型全局,靜態,本地和自動
- 20. 哪裏有靜態變量存儲在asp.net aspx頁面
- 21. 存儲靜態變量(數據段或堆或BSS)在哪裏?
- 22. 哪裏存儲在Java中的靜態變量?
- 23. Firefox 49開發工具,其中「存儲爲全局變量」存儲在哪裏?
- 24. GCC全局變量存儲
- 25. 我應該在哪裏發佈ARC的靜態本地和全局變量?
- 26. 在哪裏存儲局部變量? NSKeyedArchiver或NSUserDefaults?
- 27. Java最終局部變量存儲在哪裏?
- 28. 方法局部變量存儲在哪裏?
- 29. 靜態全局變量V靜態全局類變量
- 30. 常量編輯器的TYPO3常量在哪裏存儲?
在記憶中......? – BoltClock 2010-09-10 12:59:25