sizeof()返回的是變量聲明后所占的內存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符.
cout<<sizeof(int)<<endl; // 32位機上int長度為4
cout<<sizeof(1==2)<<endl; // == 操作符返回bool類型,相當于 cout<<sizeof(bool)<<endl;
這里有個陷阱,看下面的程序:
int a = 0;
cout<<sizeof(a=3)<<endl;
cout<<a<<endl;
輸出為什么是4,0而不是期望中的4,3???就在于sizeof在編譯階段處理的特性。由于sizeof不能被編譯成機器碼,所以sizeof作用范圍內,也就是()里面的內容也不能被編譯,而是被替換成類型。=操作符返回左操作數的類型,所以a=3相當于int,而代碼也被替換為:
int a = 0;
cout<<4<<endl;
cout<<a<<endl;
數組問題
考慮下面問題:
char a[] = "abcdef";
char b[] = {'a', 'b', 'c', 'd', 'e', 'f'};
int c[20] = {3, 4};
char d[2][3] = {"aa", "bb"};
cout<<sizeof(a)<<endl; // 7, 表示字符串
cout<<sizeof(b)<<endl; // 6, 僅表示字符數組
cout<<sizeof(c)<<endl; // 80
cout<<sizeof(d)<<endl; // 6
cout << sizeof(*a) << endl;//1
cout << sizeof(*b) << endl;//1
cout << sizeof(*c) << endl;//4
cout << sizeof(*d) << endl;//3
結論:特別如果字符數組表示字符串的話,數組末自動插入的'\0',在sizeof時不能遺漏,數組a的大小在定義時未指定,編譯時給它分配的空間是按照初始化的值確定的,也就是。c是多維數組,占用的空間大小是各維數的乘積,也就是6。可以看出,數組的大小就是他在編譯時被分配的空間,也就是各維數的乘積*數組元素的大小。
再分析下面的多維數組問題:
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4
cout<<sizeof(*a)<<endl; // 72
cout<<sizeof(**a)<<endl; // 24
cout<<sizeof(***a)<<endl; // 4
cout<<sizeof(****a)<<endl; // 8
(一)不考慮繼承關系(單繼承、多繼承、虛繼承等)
(1)不帶virtual函數時
空類:
class A
{ };
cout << sizeof(A) << endl; // 1
空類總是返回1
class B {
private :
int value;
double a;
public:};
cout << sizeof(B) << endl; //16
和struct一樣,也要考慮對齊問題,以及成員的順序因為成員函數不會分配空間,所以sizeof時只計算數據成員的大小
(2)帶virtual函數時
單繼承情況下,只要class中存在virtual函數,編譯器在編譯時就會自動插入一個指向虛函數表的指針vptr(大小為4字節). 不同的編譯器vptr插入的位置可能不同,VC編譯器插入vptr的位置一般是數據成員開始。
下例在MinGW Develper Studio2.05(gcc)下編譯,VC 6.0編譯器下結果為24 24, 我不太理解為什么...
class A
{
public:
virtual void foo() {}
private:
int m1;
double m2;
};
class B
{
public:
virtual void foo() {}
private:
double m2;
int m1;
};
cout << sizeof(A) << endl; // 24
cout << sizeof(B) << endl; // 24
產生上面的不同時數據對其的原因。
(3)帶static成員時
class A {
private :
int value;
double a;
static int CST;
public:
};
cout << sizeof(A) << endl; //16
因為static成員是分配在全局區為類的所有對象共享(VC編譯器可能為了方便將其放入文字常量表), sizeof時不應該計入static成員