[英]Can anyone explain to me why the sizeof function returns different values in below code?
任何人都可以解釋為什么sizeof
函數在下面的代碼中返回不同的值?
//static member
class one
{
public :
static const int a = 10;
};
//non static member
class two
{
public :
int a;
};
int main()
{
cout << sizeof(one); //print 1 to lcd
cout << sizeof(two); //print 4 to lcd,differ from size of one class
}
你應該學習的第一件事是sizeof
不是一個函數,它是一個像+
或||
的運算符 。
至於你的問題。 靜態成員變量實際上不是在課堂上以同樣的方式非靜態成員變量,所以只有靜態成員類將有大小為零。 但同時所有對象都需要可尋址,因此具有,這就是sizeof
為第一堂課提供1
原因。
one
沒有非靜態成員,因此它的一個實例是空的。 靜態成員不包含在該類型的任何對象中,而是獨立於任何對象而存在。 它的大小為1而不是零,因為C ++不允許類型的大小為零(以確保不同的對象具有不同的地址)。
two
確實有一個非靜態成員,因此實例必須足夠大才能包含該成員。 在您的情況下,其大小為4,與其int
成員的大小相同。
靜態數據成員不存儲在類本身中,因此不會對類的sizeof
有所貢獻。 我們可以通過轉到草案C ++標准部分9.4.2靜態數據成員來看到這一點:
靜態數據成員不是類的子對象的一部分。
類one
的大小為1
,因為完整的對象應具有非零大小,從段9
類 ,其表示:
類類型的完整對象和成員子對象應具有非零大小。 106
注意, sizeof
是一個操作符而不是一個函數。
在one
,在計算類/對象的大小時不考慮靜態變量a
。
在two
中, a
將被認為是,在這種情況下,等同於sizeof(int)
。
筆記:
sizeof
是一個運算符,而不是一個函數。 one
必須是這樣,因而它的尺寸為1。 有關sizeof
運算符的有用參考; http://en.cppreference.com/w/cpp/language/sizeof
注:原題的變量是tow
不two
。
簡單的答案是, one
和tow
是不同的類,大小不同。
tow
包含int,我假設你的編譯器是4個字節。 我想你明白那一部分。
靜態成員不存在於類的每個實例中,但它是在所有類之間共享的全局變量。 因此,它不包括在班級規模中。 這是因為sizeof
通常用於為對象分配內存,並且不需要為不在類實例中的變量分配內存。 這就是為什么one
不是4個字節。
它是1字節的原因是因為C ++標准不允許類具有0字節的大小,因此編譯器已將其填充為非0大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.