2015-11-03 242 views
0

每當我介紹變量並打印他們的地址時,顯然他們傾向於存儲在具有固定間距的地方,從我介紹的第一個或最後一個變量(取決於編譯器)開始。C++中的內存分配

C++實際上是否以一種方式分配內存:在特定時間引入的所有變量都被賦予其內存一行?如果是這樣的話,對內存管理來說不是壞事,因爲編譯器必須確保它找到足夠的空間來爲我們在一行中引入的所有變量提供內存。

例如,

int a, b, c; 

當我打印&a&b&c, 然後,我有編譯器的一個答案是:

0xbffe2534 
0xbffe2538 
0xbffe253c 

正如你可以看到&b-&a=4&c-&b=4

在另一個編譯器,答案是:

0xbffe2534 
0xbffe2538 
0xbffe253c 

再次&b-&a=4&c-&b=4

回答

0

C++標準沒有規定任何特定的內存分配策略。

你看到的是非靜態局部變量和參數最常見的策略。它們通常分配在機器堆棧上。該標準要求它們按照創建的相反順序銷燬,所以機器堆棧分配策略僅僅是在當前使用區域的末尾添加下一個所需變量(通常在存儲器中向下),並且當執行退出塊時,通過縮小使用區域來釋放內存。

請注意,這種策略適用於普通的函數調用,其中嵌套了對調用和返回,但與協程不太一致,在那裏你有更多的任意控制轉移。爲了與協同程序一起工作,每一個都必須配備足夠大的連續內存區域以用作堆棧,並且這對於細粒度抽象可能是昂貴的。然後,堆棧的鏈表表示可以更好地工作,但我不知道任何支持它的C++編譯器(可能是因爲標準庫不支持協程)。

當您使用多個線程時,每個線程在實踐中都會有自己的連續區域堆棧。這並不像聽起來那麼糟糕,因爲線程常常用於比coroutine更重的處理,只有幾個線程。免責聲明:我沒有花時間去了解在過去2 - 3年裏涌入的無數多處理技術。因此,即使我對傳統編程熟悉的Visual C++也可能支持鏈接堆棧,作爲某種上下文的語言擴展。

0

C++中的內存分配完全取決於實現。 C++編譯器可以做他們想做的任何事情,並將從平臺變爲平臺,並從版本變爲版本。有一個通用標準,大多數C++編譯器都遵守,但與C++ 無關,可以說每個例子都是

0

你分配內存的方式,變量將被放置在堆棧上。這意味着當你聲明時,它會被推到stack上。看看這段代碼:

void f(int a){ 
    int b=a; 
    if(a) 
    f(a-1); 
    printf("%i, %i\n", a, b"); 
} 

在這裏,當處理器進入函數f時,它將b推入堆棧以存放它。然後它再次調用f。現在我們不能將b存儲在前一個調用的相同位置,因爲我們仍然需要該值。所以每次你輸入一個函數(或者實際上是一個範圍)時,你的本地變量被壓入堆棧,並保持在那裏直到你再次離開那個函數(範圍)。

還有一種分配內存的方式,那就是堆。這由c中的malloc()或int C++中的new int完成。我現在不打算解釋這一點。只是谷歌它;)並記住free()delete