一、sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它並不是函數。sizeof操作符以字節形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括號內的類型名。操作數的存儲大小由操作數的類型決定。
二、sizeof的使用方法
1、用於數據類型
sizeof使用形式:sizeof(type)
如sizeof(int)。
2、用於變量
sizeof使用形式:sizeof(var_name)
三、sizeof的結果
sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。
1、若操作數具有類型char、unsigned char或signed char,其結果等於1。
ANSI C正式規定字符類型為1字節。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double類型的sizeof 在ANSI C中沒有具體規定,大小依賴於實現,一般可能分別為2、2、2、2、 4、4、4、8、10。
3、當操作數是指針時,sizeof依賴於編譯器。例如Microsoft C/C++7.0中,near類指針字節數為2,far、huge類指針字節數為4。一般Unix的指針字節數為4。
4、當操作數具有數組類型時,其結果是數組的總字節數。
5、聯合類型操作數的sizeof是其最大字節成員的字節數。結構類型操作數的sizeof是這種類型對象的總字節數,包括任何墊補在內。
四、sizeof後面的參數對sizeof的用法做個總結。
A. 參數為數據類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int類型在16位系統中占2個字節,在32位系統中占4個字節。
B. 參數為數組或指針。下面舉例說明.
int a[50]; //sizeof(a)=4*50=200; 求數組所占的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針
//的大小,在32位系統中,當然是占4個字節。
C. 參數為結構或類。Sizeof應用在類和結構的處理情況是相同的。但有兩點需要注意,第一、結構或者類中的靜態成員不對結構或者類的大小產生影響,因為靜態變量的存儲位置與結構或者類的實例地址無關.
九個注意點:
1.sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。
2.sizeof是運算符
3.sizeof可以用類型做參數,還可以用函數做參數
4.數組做sizeof的參數不退化
5.sizeof在編譯期已經確定大小,這就是sizeof(x)可以用來定義數組維數的原因
6.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數
7..當適用了於一個結構類型時或變量, sizeof 返回實際的大小, 當適用一靜態地空間數組, sizeof 歸還全部數組的尺 寸。 sizeof 操作符不能返回動態地被分派了的數組或外部的數組的尺寸
8..計算結構變量的大小就必須討論數據對齊問題。為了CPU存取的速度最快(這同CPU取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),C++在處理數據時經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。MS VC++中的對齊設定,有時候sizeof得到的與實際不等。一般在VC++中加上#pragma pack(n)的設定即可.或者如果要按字節存儲,而不進行數據對齊,可以在Options對話框中修改Advanced compiler頁中的Data alignment為按字節對齊。
9..sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。如sizeof(max)若此時變量max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式
【sizeof使用場合】
1.sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信
2.用它可以看看一類型的對象在內存中所占的單元字節。
3.在動態分配一對象時,可以讓系統知道要分配多少內存。
4.便於一些類型的擴充,在windows中就有很多結構內型就有一個專用的字段是用來放該類型的字節大小。
5.由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof來代替常量計算。
6.如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。