2013-02-22 79 views
12

我創建僅具有2個公共函數(構造和析構),並使用操作者sizeof每班即將爲1C++ sizeof運算符如何計算大小?

當我char類型的私有數據成員添加到上面的類聲明中的X類,大小仍然爲1. 最後,我添加一個整數類型作爲類數據成員,現在的大小是8個字節。

請向我解釋班級規模是如何計算的。

+0

請張貼相關的代碼。 – 2013-02-22 20:58:17

回答

23

首先,認識到非虛擬函數對類的大小沒有影響。

任何類的實例的大小至少爲1個字節,即使該類爲空,以便不同的對象將具有不同的地址。

添加一個char可確保不同的對象具有不同的地址,因此編譯器不會人爲地添加一個大小。大小然後sizeof(char) = 1.

然後,您添加一個int,它(可能)在您的平臺上添加4個字節。然後編譯器決定填充該類,以便根據性能/ CPU要求的原因進行對齊,並添加3個空字節,以便現在的大小爲1 + 3 + 4 = 8。它可能會在填充int成員之前添加填充它將在4字節的邊界上對齊,但除非你的CPU需要,否則不需要。

你可以在the Wikipedia page上閱讀關於填充的內容。

+2

我認爲它是'c --- iiii'而不是'ciiii ---',正如這個答案所暗示的那樣。 – zch 2013-02-22 21:03:16

+4

@zch我不是故意暗示,因爲它取決於編譯器。但是我會改變添加順序並添加一個註釋,如果它看起來不那麼困惑。 – 2013-02-22 21:04:04

+0

感謝很多@SethCarnegie的解釋。我知道一點關於填充,將深入挖掘它,因爲我懷疑爲什麼沒有填充時,即使邊界是4字節時只聲明一個字符。 :) – user2100866 2013-02-22 21:26:27

8

有很多因素決定了C++中類的一個對象的大小。這些因素是:

  1. 所有非靜態數據成員的大小
  2. 訂單數據成員的
  3. 字節對齊或字節的填充
  4. 其緊鄰基類的大小
  5. 虛擬功能的存在(s)(使用虛函數的動態多態)。
  6. 編譯器使用
  7. 模式繼承(虛擬繼承)的

你可以找到更多在這裏http://www.cprogramming.com/tutorial/size_of_class_object.html