本節包含sizeof()計算結構體,位域,數組,字符串,指針,c++中的class等類型的大小,sizeof()計算的大小都是以字節爲單位。html
一 計算基本類型的長度c++
sizeof(char): 1windows
sizeof(short): 2數組
sizeof(int): 4函數
sizeof(long): 4(win X86 和 win X64長度都爲4, Linux X86長度爲4,Linux X64爲8)spa
sizeof(float):4設計
sizeof(double):8指針
sizeof(bool):1(在C++里長度爲4)code
sizeof(BOOL):4 (在windows平臺長度爲4)htm
sizeof(p):指針類型在X86長度爲4,X64長度爲8,如char *p
二 計算結構體的長度
要正確計算sizeof(結構體)的大小,須要理解和掌握數據對齊的概念。數據對齊的概念在前面內存中的數據對齊 和 天然對齊和強制對齊有介紹。
關鍵是記住天然對齊和強制對齊的對齊規則,計算sizeof(結構體)的大小就很簡單了。
三 計算數組長度
char str[] = "hello"; sizeof(s)大小是多少
1 普通狀況
str是字符數組,由字符串"hello"初始化,"hello"; 共5個字符,又字符串以 '\0' 結尾。因此str數組的長度是6
sizeof(s)爲6
2 str數組作函數參數
在函數裏,數組str做爲參數傳進來,在函數內部str是指針的形式。因此:
sizeof(s)爲4 X86平臺
sizeof(s)爲8 X64平臺
四 計算union的長度
在使用sizeof計算union類型的時候,整個union結構的大小等於union中最大成員的大小,而且必須是最大類型的整數倍。
例如:
typedef union
{
long i;
int k[5];
char c;
} DATE;
struct data
{
int cat;
DATE cow;
double dog;
} too;
DATE max; sizeof(struct data) = ?sizeof(max))=?
分析:
因爲max是union DATE類型,那麼其中最大的成員爲k,因此sizeof(MAX)=k成員的長度=5*sizeof(int)=20
對於struct data結構體,按照天然對齊方法,計算出結果爲:sizeof(struct data)=4+20+8=32
五 計算位域結構的大小
位域結構的大小在位域(位段)有介紹。
六 計算類和對象的大小 (C++中)
class A { public: A(); ~A(); private: }; void main() { printf("sizeof(A): %d\n", sizeof(A)); getchar(); }
sizeof(A) = 1。由於類的實例化就是給每一個實例在內存中分配一塊內存地址。空類被實例化時,會由編譯器隱含得添加一個字節,因此爲1。
class B { void fn1(); void fn2(); protected: char a; char b; int c; static int d; };
sizeof(B) = 8。
類B中最大類型是int。a長度1字節,b長度1字節,int型c內存地址必須能夠被4整除,static變量d不影響類的大小。
因此sizeof(B) = 變量a的長度1 + b的長度1 + 對齊2字節 + 變量c的長度4字節 = 8
class A { protected: int a; private: int b; }; class B :public A { private: int c; };
sizeof(B) = 12 B繼承A,因此B中包含了A中的全部數據,大小爲A內的大小8+B內的大小4 = 12
class C { virtual void fun(){} };
sizeof(C) = 4 由於類C中包含一個指向虛函數表的指針。
class D { virtual void fun1() {} virtual void fun2() {} };
sizeof(D) = 4 多個虛函數只須要一個指向虛函數表的指針
七 sizeof與strlen
char *p1 = "12345678";
char p2[] = "12345678";
char p3[1024]="12345678";
char p4[] = {'1','2','3','4','5','6','7','8'};
sizeof(p1)=?
sizeof(p2)=?
sizeof(p3)=?
sizeof(p4)=?
strlen(p1)=?
strlen(p2)=?
strlen(p3)=?
strlen(p4)=?
分析:
p1是一個字符指針,指向了靜態常量區的一個常量字符串,"12345678"。因此,sizeof(p1)=指針的長度=4;strlen(p1)=字符串"12345678"的長度(不含'\0'),因此是8。
p2是一個字符數組,由靜態常量區的"12345678"進行初始化。因此sizeof(p2)是計算數組p2的長度,因此結果爲"12345678"的全部字符的長度(含'\0'),因此是9。 strlen(p2)也是在計算"12345678"的長度(不含'\0'),因此是8。
p3是一個字符數組,由靜態常量區的"12345678"進行初始化,但長度爲1024。 因此,sizeof(p3)=1024;strlen(p3)爲字符串"12345678"的長度(不含'\0'),因此是8。
p4是一個字符數組,由字符'1','2','3','4','5','6','7','8'進行初始化, 這樣初始化與"12345678"進行初始化的區別是 前者不包含'\0'。所以,sizeof(p4)=8。因爲p4做爲一個字符數組,並不以'\0'結尾, 因此strlen(p4)在計算字符串長度的時候,找不到結束符'\0',會發生字符串溢出。
因此,最後答案爲:
sizeof(p1)=4
sizeof(p2)=9
sizeof(p3)=1024
sizeof(p4)=8
strlen(p1)=8
strlen(p2)=8
strlen(p3)=8
strlen(p4)=字符串溢出,值不肯定,甚至會引發程序崩潰
八 sizeof其它
題目1:請設計一個宏,用來計算數組的長度。解:#define ARRAYLEN(a) sizeof(a)/sizeof(a[0])題目2:sizeof是函數嗎?是在程序編譯的時候計算的仍是運行時?解:sizeof是操做符而不是函數。sizeof是在程序編譯的時候就計算完成了,而不是在程序運行的時候計算。