2010-03-08 135 views
4

我總是對靜態變量以及內存分配的方式感到困惑。靜態變量的內存分配

例如:

int a = 1; 
const int b = 2; 
static const int c = 3; 

int foo(int &arg){ 
    arg++; 
    return arg; 
} 

是如何記憶abc分配呢?

如果我撥打foo(a)foo(b)foo(c),有什麼區別(內存方面)?

+7

你不能調用'foo(b)'或'foo(c)'。 – Yacoby

+3

也許值得了解的是,在C++中,'b'和'c'都有靜態鏈接。在C中,'b'具有外部鏈接。 –

回答

7

我一直困惑的靜態變量

在全球範圍內,只有static意味着鏈接時,將不可見的其他文件。

分配給a,b和c的內存是如何分配的?

它們都將存在於可執行文件(例如__DATA段)中,該文件將被映射到執行中的RAM中。如果編譯器是好的,bc將存在於只讀數據區(例如__TEXT段)中,或甚至在優化中消除。

如果我調用foo(a),foo(b)和foo(c),有什麼區別(就內存而言)?

foo(b)foo(c)將編譯器錯誤,因爲const int&不能轉換到int&

否則沒有區別。通過引用相當於在CPU的意義上通過指針傳遞。所以每個內存的地址都被佔用,並調用foo

1

內存分配相同,爲您的三個變量。區別在於編譯器如何處理它們。由於bcconst聲明,如果您嘗試修改它們的值,編譯器會對您抱怨。由於c定義爲static,因此它不會在當前文件之外訪問(可以使用extern訪問ab)。

所有這三個內存將被分配在可執行文件內部,禁止任何優化(有時編譯器可以通過在常量的引用處填入常量值來消除爲常量分配內存的需要)。

你的函數調用會爲a但不工作的bc沒有明確的鑄造(因爲你的函數需要一個指向非constint)。但是,如果您嘗試將const值轉換爲非const值,則編譯器應該對您抱怨。