簡體   English   中英

變量在C ++中存儲在內存中的什么位置?

[英]Where in memory are variables stored in C++?

如果我有這樣的代碼:

int e;
int* f;

int main() {
    int a, b, c;
    int* d;
}

這些變量存儲在內存中的什么位置? 而且,定義全局變量(在函數外,在這種情況下像main這樣)是什么問題?

實際上,我們不能保證僅將變量放在內存中。

但是在大多數(也許是全部)實際系統上, ef將位於全局數據部分,而abcd則混合在寄存器中並位於調用堆棧中。 fd都可以指向內存中的任何位置(嗯,對於MMU而言,這並不完全正確,它們可以指向映射到進程的內存子集中的任何位置)。

a,b,c和d將存在於堆棧中。 如果要創建一個int實例(使用malloc或new),則該實例將進入堆-但稱為“ d”的指針仍將存在於堆棧中。

e和f在應用程序的內存空間(即所謂的“數據段”)中分配了空間-請參閱:

http://en.wikipedia.org/wiki/Data_segment

您還詢問了堆棧大小:由編譯器配置,請參見此處:

http://msdn.microsoft.com/zh-CN/library/tdkhxaks(VS.71).aspx

您為什么認為這很重要? 請注意,在現代C ++中,具有局部指針變量極為罕見。

在典型的系統上,a,b,c和d將存在於堆棧中。 但這是一個實現細節,語言標准對此沒有具體說明。

通常,a,b,c,d *將在程序堆棧上定義,盡管C ++ ISO標准未指定應在何處定義變量。

對於第二個問題,全局變量的問題是它們沒有保護。 對於依賴全局變量的簡單腳本/應用程序來說可能沒問題,但是在庫和更復雜的代碼中,這會產生潛在的問題:任何代碼都可以隨時更改具有全局范圍的變量的值,而將任何依賴於全局變量的代碼保留在不希望的狀態。

此外,由於變量在全局范圍內,因此如果您使用任何其他定義了具有相同名稱的全局變量的代碼,則它們很可能發生命名沖突。

要點是變量的范圍,它定義了變量的生存期。 main的變量outsie將在程序運行期間可用。 在main()函數期間,main內部的變量將可用。

實際上,功能范圍的變量通常在堆棧上分配,而全局變量在堆上分配,但這是實現細節。

全局變量的主要問題是控制訪問,並且在多線程程序中可能很難使用它們。

編輯:正如@FredOverflow在下面指出的那樣,全局變量通常分配在加載可執行映像時設置的數據區域中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM