2011-01-09 90 views
7

考慮下面的代碼:理解C++結構尺寸

struct CExample { 
    int a; 
}    

int main(int argc, char* argv[]) { 

    CExample ce1; 
    CExample ce2; 

    cout << "Size:" << sizeof(ce1) << " Address: " << &ce1 << endl; 
    cout << "Size:" << sizeof(ce2) << " Address: " << &ce2 << endl; 

    CExample ceArr[2]; 
    cout << "Size:" << sizeof(ceArr[0])<< " Address: "<< &ceArr[0] <<endl; 
    cout << "Size:" << sizeof(ceArr[1])<< " Address: "<< &ceArr[1] <<endl; 

    return 0; 
} 

輸出例如:
CE1:大小= 4,地址:0039FAA0
CE2:大小= 4,地址:0039FA94
ceArr [0] :大小= 4,地址:0039FA84
ceArr [1]:大小= 4,地址:0039FA88

隨着代碼存在第一兩個對象的地址(CE1和CE2),但是之間的12字節的有隻是一個4字節的差異賭注查看數組中的對象。

我認爲數據調整與這個問題有關,但我仍然難倒了。任何想法這裏究竟發生了什麼?

+2

上面的輸出是什麼?在代碼中發表意見? – 2011-01-09 16:51:40

回答

15

因爲數組中的對象需要連續。在堆棧中(在源代碼中,而不是在機器上)連續聲明的對象不是[需要連續],儘管它們可以是。

+1

那麼,他們**可以**,但他們不**必須**。 – 2011-01-09 16:56:37

+0

@比利這就是我所說的。 – 2011-01-09 16:57:55

+0

對不起。誤解。第二句話,自己讀,似乎說,他們從來沒有連續。對不起:( – 2011-01-09 16:58:57

6

該標準對此沒有提及。編譯器可以自由地在項目之間插入任何想要的填充。

(如果我猜,我猜你的編譯器實現在調試模式下某種形式的堆棧保護/金絲雀(和你在調試模式下)編譯)

0

的原因是,在大多數架構,未對齊的負載都很慢。請參閱data structure alignment上的維基百科條目以獲得更好的解釋。編譯器將每個數據結構放置在數據字的開頭。但是,在數組中,這些項目會連續放置在內存中(正如C++標準所要求的那樣)。

1

編譯器不僅使用堆棧保留本地變量 - 它還將其用於例如參數傳遞以及由std::cout引起的一些開銷。這可能是您的變量之間的額外空間用於。

如果你不是讓你的變量static,像這樣:

static CExample ce; 
static CExample ce2; 

static CExample ceArr[2]; 

...變量將被放置在BSS內存,而是和校準將更有可能是你所期望的。

爲什麼陣列被打包,而單個項目沒有被澄清其他答案...