C++中sizeof詳解

sizeof並不是一個函數,而更像是一個特殊的宏,它是在編譯期間求值的。如如下的題目:
函數

int a = 0;
cout << sizeof(a=3) << endl;
cout << a << endl;

輸出結果爲4,0,那麼爲何不是4,3呢?緣由就在於sizeof不能被編譯成機器碼,那麼其做用範圍內的內容不能被編譯,而是被替換成類型,=操做符返回左操做數的類型。因此sizeof不支持鏈式表達式。指針

sizeof有兩種用法:code

  1. sizeof(object),對對象進行sizeof,也能夠寫成sizeof object,從這個能夠看出,sizeof不多是一個函數,由於沒有哪一個函數傳參數是不須要括號的對象

  2. sizeof(typename)內存

若是要用sizeof求的複合型類型,如union,struct,class,的對齊方式爲成員中對齊方式最大的成員的對齊方式。編譯器

  • 易錯點:it

  • q:定義一個空類型,裏面沒有任何成員變量和成員函數,對該類型求sizeof,獲得的結果是什麼?io

  • a:答案爲1。由於空類型的實例中不包含任何信息,原本求sizeof應該是0,可是當咱們申明該實例的時候它必須在內存中包含必定的空間,不然沒法使用這些實例。至於佔用多少內存,由編譯器決定,vs2010每一個空類型的實例佔用1字節的空間。編譯

  • 若是在這個類型中添加一個構造函數和析構函數,再對該類型求sizeof,獲得的結果又是多少?class

  • a:仍是1,由於調用構造函數和析構函數只需知道函數的地址便可,而這些函數的地址只與類型有關,而與類型的實例無關,編譯器也不會由於這兩個函數而在實例內添加任何額外的信息。

  • q:若是把析構函數標記爲虛函數呢?

  • a:C++編譯器一旦發現一個類型中有虛函數,就會爲該類型生成虛函數表,並在該類型的每個實例中添加一個指向虛函數表的指針,32bit是4,64bit是8

相關文章
相關標籤/搜索