sizeof用法
一、sizeof的概念
sizeof是c語言的一種單目操作符,尤其注意的是,它不是乙個函式。sizeof接收乙個運算元,運算元可以是乙個表示式或者是括在括號內的資料型別名。sizeof操作符以位元組形式給出其運算元的棧儲存大小。
sizeof不是函式,也不是運算子,它是個類似巨集定義的關鍵字,sizeof()括號內的內容不會被編譯,而是被型別所替代。
例如:
int a = 8;
sizeof(a);
其中,sizeof(a)將會被替代成sizeof(int).
sizeof(a = 6);
其中,括號中的內容不會編譯執行,即a = 6不執行,而是替換成sizeof(int)。
二、sizeof的用法
1、運算元是資料型別
sizeof(資料型別),且資料型別必須放在括號裡,比如:sizeof(int)。
2、運算元是變數
sizeof(變數),變數也可以不放在括號裡。
三、sizeof的結果
一般情況下,sizeof的結果大都依賴與編譯器型別(unix,ms),所以不同編譯器對資料型別的定義也不一樣。
sizeof的結果型別被定義為size_t,其中size_t被定義為unsigned int。
1、若運算元為char、unsigned char或signed char時,其結果為 1;
2、其它如int、long、float、double依賴於編譯器的定義。
在vs2008中基本資料型別占用的位元組數如下:
sizeof(char) == sizeof(bool) == 1;
sizeof(short) ==2;
sizeof(int) == sizeof(long) == sizeof(float) ==4;
sizeof(double) == 8;
3、當運算元為指標時,也是依賴於編譯器,但一般為指標位元組數為4;
4、當運算元具有陣列型別時,其結果是陣列的總位元組數。但是,如果運算元是函式中的陣列形參或函式型別的形參時,sizeof給出其指標的大小;
int a[2]; sizeof(a) == 2*4=8;
void fun(int arr)
輸出:4
5、當運算元是聯合(aggregate)型別時,sizeof結果是其最大位元組成員的位元組數;列如:
union test;
sizeof(test) == sizeof(int) == 4;
6、當運算元是結構體型別時,sizeof結果是結構體的總長度,包括任何的填充位元組。例如:
struct test;
一般情況下,sizeof(test) == 16;實際上就是sizeof(test)=sizeof(char) + 7 + sizeof(double) == 16,這裡涉及到結構體資料對齊問題。
除了以上6點之外,還要注意下面的問題:
1、不要把sizeof當成函式,也不看作是一元操作符,把它當成乙個特殊的編譯預處理。
int a =0;
cout
02、自定義型別的sizeof同等於它的型別原形。
typedef char byte;
typedef long dword;
sizeof(byte) == sizeof(char);
sizeof(dword) == sizeof(long);
3、不管是什麼型別的指標,大小都是4。
sizeof(int *) == sizeof(char*) == sizeof(long*) == sizeof(double*);
4、陣列的大小是個維數的乘積*陣列元素的大小。
int a[2][4];
sizeof(a) == 32 == 2*4*sizeof(int);
5、字串的sizeof和strlen的區別
strlen()計算字元陣列的字元數,以"\0"為結束判斷,不計算為'\0'的陣列元素。而sizeof計算資料(包括陣列、變數、型別、結構體等)所佔記憶體空間,用位元組數表示。
char str = "abcd";
cout
cout
1、空類的sizeof為1,類中的成員函式不占用棧的空間,其儲存在資料段中;
2、若類中包含成員變數,計算方法與結構體struct的計算方法一致,靜態成員變數不占用棧空間,其儲存在靜態資料區;
3、若類中有虛函式,或者其父類或者祖先中有虛函式,則子類的每個物件中儲存乙個指向虛函式表(vtable)的指標vptr,占用4位元組棧空間;
4、子類完全繼承父類中的成員變數,不論是何種型別(public,private,protected);
5、子類和父類中都有虛函式時,在子類中其實只有乙個虛函式表(多重繼承除外),因此子類物件中只儲存乙個虛函式表指標;
6、當在多重繼承中,多個父類含有虛函式時,子類中有多個虛函式表,數量等於含有虛函式的父類的個數,其中子類中的虛函式只儲存在第乙個繼承的含有虛函式的父類的虛函式表中,因此子類的物件中有多個虛函式指標。
sizeof 用法彙總
sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷,不計算為 0 的陣列元素。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的...
sizeof 用法彙總
sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷,不計算為 0 的陣列元素。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的...
sizeof 用法彙總
sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷,不計算為 0 的陣列元素。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的...