今天看程序員面試寶典的時候遇到一個問題,書上有這麼一句話:sizeof計算棧中分配的大小。咋一看這句話的時候,很不理解,難道像函數中類似於static、extern const類型的變量的sizeof都是0?
本著實踐出真知的原則,我測試了一下:
static int s = 10;
extern const int h = 10;
void main()
{
cout << sizeof(s) <<endl<<sizeof(h)<< endl;
getchar();
}
輸出結果:
4
4
結果和書上所說明顯不符,再仔細看書,發現這句話的上下文是類中,確實,當sizeof計算類的大小的時候,是不考慮static這種共享成員的。
class A1
{
public:
A1():d(10){};
int a;
char c;
const int d;
static int b;
};
void main()
{
A1 x;
int *p = (int *)&(x.d);
*p = 20;
cout << sizeof(A1)<<endl;
getchar();
}
輸出結果:
12
雖然書上說的是有上下文情境的,但我覺得很容易誤導讀者,所以,在此,我就根據資料和我自己的理解來對sizeof做個說明:
sizeof的本質是得到某個類型的大小,確切的來說就是當創建這個類型的一個對象(或變量)的時候,需要為它分配的空間的大小。而類也可以理解為類似於int、float這樣的一種類型,當類中出現static成員變量的時候,static成員變量是存儲在靜態區當中的,它是一個共享的量,因此,在為這個類創建一個實例對象的時候,是無需再為static成員變量分配空間的,所以,這個類的實例對象所需要分配的空間是要排除static成員變量的,於是,當sizeof計算類的大小的時候會忽略static成員變量的大小。
根據上述我所提出的解釋,就能說明static變量不在類中的時候,用sizeof得到的大小為什麼不是0了,因為static不在類中的時候,為static類型(static int等等)定義一個變量的時候,是必須要分配空間的,所以sizeof計算得到的就是為這個類型的 變量分配的空間的大小。
如有不足,還請各位指正!