2010-03-02 71 views
55

可能重複:
C++: What is the size of an object of an empty class?爲什麼C++中空類的大小不爲零?

爲什麼下面的輸出1

#include <iostream> 

class Test 
{ 
}; 

int main() 
{ 
    std::cout << sizeof(Test); 
    return 0; 
} 
+4

有一個虛擬佔位符成員,其大小恰好是一個字節。由於對於Test [10]的數組,每個對象都應該有一個唯一的地址。 – legends2k 2010-03-02 10:06:17

+4

一個有趣的優化是'空基優化',這意味着如果你從一個空基類繼承(沒有屬性,沒有虛方法),那麼你的類的大小將不會增長。有許多(其他)條件,但它解釋了爲什麼在某些情況下私下繼承謂詞。 – 2010-03-02 15:55:38

+0

[類似問題1](http://stackoverflow.com/questions/1626446)和[類似問題2](http://stackoverflow.com/questions/621616/)。 – Lazer 2010-05-16 06:11:36

回答

86

的標準不允許大小爲0的對象(和類物),因爲這將有可能使兩個不同的對象具有相同的存儲器地址。這就是爲什麼即使是空類也必須具有(至少)1的大小的原因。

+2

嗯...但不應該連接器能夠照顧,無論sizeof()返回什麼?這不是更像是一種副作用嗎?我明白你在說什麼,但是對於sizeof(Test)返回0是不是完全可行的。但是,如果標準這麼說,它就是這樣說的。事實上,一旦明確而不是故意含糊地描述某個主題,這是一件好事。 – 2010-03-02 10:07:32

+12

@Amigable,那麼會測試一個[10];'有大小?而'sizeof a/sizeof * a'會被0除。並且'for(Test * i = a; i!= a + 10; i ++)f(i);'也會失效。我相信這會造成很多問題,因爲在編譯器*和用戶代碼中需要很多特殊情況。 – 2010-03-02 12:21:49

+0

@Johannes,如此真實。我沒有想到這一點。 – 2010-03-03 13:55:55

27

爲了確保兩個不同對象的地址會不同。 出於同樣的原因,「新」始終 返回指向不同對象的指針。

請參閱Stroustrup以獲得完整答案。

+1

轉到直接頁面鏈接 – 2013-03-03 04:12:00

20

C++標準保證任何類的大小至少爲1。 C++標準規定任何對象都不應該具有與另一個對象相同的內存地址。這有幾個很好的理由。

  1. 爲了保證new將始終返回一個指向不同內存地址的指針。

  2. 爲了避免零分。例如,指針算術(其中許多是由編譯器自動完成的)除以sizeof(T)

不過請注意,這並不意味着空基類將增加1至派生類的大小:

struct Empty { }; 

struct Optimized : public Empty { 
    char c; 
}; 

// sizeof(Optimized) == 1 with g++ 4.0.1 

Bjarne Stroustrup talks about this了。

+2

什麼指針算術涉及'sizeof(T)'_dividing_?我想不出一個例子。 Plase添加至少一個示例。 – MSalters 2010-03-02 13:55:52

+4

@ MSalters:遍歷T類型元素的數組。 – wilhelmtell 2010-03-02 16:32:55

+1

@MSalters:減去兩個指針返回元素之間的數量,而不是字節數。 – 2010-10-11 01:53:59

3

Maurits和Péter說了些什麼。

有趣的是,在這一背景下的編譯器可以做的空基類優化(EBCO)注意:

#include <iostream> 
struct Foo {}; 
struct Bar : Foo {}; 
int main() { 
    std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;   
} 

這可能會打印出「1,1」如果你編譯並運行它。請參閱EBCO上的Vandevoorde/Josuttis 16.2

9

沒有任何數據成員和成員函數的類這種類的類被稱爲空類。空類對象的大小始終爲1個字節。

當我們創建任何類的對象的時候,對象總是獲得3個特徵,即

  1. 國家
  2. 行爲
  3. 身份

當我們在該對象的那個時候國家創建空類的對象是什麼。該對象的行爲也不算什麼,但編譯器會爲該對象分配一個唯一的地址。 計算機中的內存始終以字節的形式組織,並且對象地址位置處的最小內存爲1個字節。這就是爲什麼空類對象的大小是1字節的原因。

+0

如果任何人想要旋轉對象的3個特徵,即1)狀態2)行爲3)身份然後問我 – Shantanu 2011-10-17 08:13:32

相關問題