空類的背後

2021-06-04 03:24:58 字數 1703 閱讀 8932

在一些面試過程的時候,有時候會問到有關記憶體對齊相關的問題,比如結構體的大小,這些問題的回答就必須要考慮記憶體對齊的問題了。記得有次**面試,面試官問我乙個空類的大小是多少,當時自己回答是

0位元組,但後來驗證了一下才知道原來是

1位元組。為什麼空類的大小是

1位元組呢,而不是

4位元組或其它呢?

從下面的**結合來分析一下:

#include #include using namespace std;

class empty {};

int main()

輸出的結果是

1位元組。

為什麼會是乙個位元組呢?此時空類中包含了哪些東西呢?在看《

effective c++

》時,條款

5說到了編譯器會自動的為空類宣告乙個

copy

建構函式、乙個

copy assignment

操作符和乙個析構函式,編譯器產生的析構函式是

non-virtual

的。如果沒有宣告乙個

default

建構函式,編譯器也會自動為其生成乙個,所有的這些函式都是

public

和inline的。

從正面中我們可能比較難以理解。在

vc6.0

反彙編的**我們來看看。

52:       printf("%d\n", sizeof(empty));

00401048 6a 01                push        1

0040104a 68 1c e0 42 00        push       offset string "%d\n" (0042e01c)

0040104f e8 0c 71 00 00        callprintf (00408160)

00401054 83 c4 08             add         esp,8

push 1

就是表示空類的大小是

1個位元組了。這裡也可以知道

printf

的格式化字串是放在常量資料區的,直接以位址來標識。知道函式呼叫約定的人就明白上面的**了。可以參考部落格的乙個文章。

53:       empty e1;

54:       empty e2(e1);

00401057 8a 45 fc             mov         al,byte ptr [ebp-4]

0040105a 88 45 f8             mov         byte ptr [ebp-8],al

55:       e2 = e1;

0040105d 8a 4d fc             mov         cl,byte ptr [ebp-4]

00401060 88 4d f8             mov         byte ptr [ebp-8],cl

從類的物件進行的操作我們也知道編譯器在背後為我們做了一些事情。

從彙編**我們就可以看出,運算元都是

byte

的。也就是說空類只是給了乙個計算機能夠表示的最小單位,這裡乙個位元組是在

win32

平台的,其它的平台暫時不知道。

留個問題:乙個類的大小究竟包含哪些內容?這些都是一些基礎的知識,所以在筆試或者面試的時候會經常考的。

c 空類的大小

初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...

c 空類的大小

定義乙個空類,沒有資料 class empty class test2 private empty private繼承 class test3 public empty public繼承 int tmain int argc,tchar argv cout class test1 class tes...

C 空類的研究

1.c 空類及沒有成員變數的類的大小例項分析 眾所周知的c 中空類的大小為1,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有相當一部分開發人員對此有很多不明之處的。這裡我們以如下 為例 include using namespace std class a class b class c ...