主要來自 http://www.shnenglu.com/andxie99/archive/2006/10/26/14230.html
定義:
sizeof是C/C++中的一個(gè)操作符,作用是返回一個(gè)對象或者類型所占的內(nèi)存字節(jié)數(shù)。
使用:
sizeof有三種語法形式,如下:
1) sizeof( object ); // sizeof( 對象 );
2) sizeof( type_name ); // sizeof( 類型 );
3) sizeof object; // sizeof 對象;
通常不用(3)。object可以是表達(dá)式,即sizeof可以對一個(gè)表達(dá)式求值,編譯器會(huì)根據(jù)表達(dá)式的最終結(jié)果類型來確定大小,通常不會(huì)對表達(dá)式進(jìn)行計(jì)算。如果對一個(gè)函數(shù)求值,則返回函數(shù)的返回值類型的大小。C99標(biāo)準(zhǔn)規(guī)定,函數(shù)、不能確定類型的表達(dá)式以及位域(bit-field)成員不能被計(jì)算sizeof值。
常量性:sizeof的計(jì)算發(fā)生在編譯時(shí)刻,所以它可以被當(dāng)作常量表達(dá)式使用。
sizeof的大小
1. 基本數(shù)據(jù)類型的sizeof是和系統(tǒng)相關(guān)的,所以在不同的系統(tǒng)下取值可能不同。
2. 指針變量的sizeof等于計(jì)算機(jī)內(nèi)部地址總線的寬度。
3. 數(shù)組的sizeof值等于數(shù)組所占用的內(nèi)存字節(jié)數(shù)。
4. 結(jié)構(gòu)體的sizeof需要考慮字節(jié)對齊。
5. 含位域結(jié)構(gòu)體的sizeof,C99中規(guī)定int、unsigned int和bool可以作為位域類型,但編譯器幾乎都對此作了擴(kuò)展,允許其它類型類型的存在。使用位域的主要目的是充分利用存儲(chǔ)空間,其大致規(guī)則為:
1) 如果相鄰位域字段的類型相同,且其位寬之和小于該類型的sizeof大小,則后面的字段將緊鄰前一個(gè)字段存儲(chǔ),直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大于該類型的sizeof大小,則后面的字段將從新的存儲(chǔ)單元開始,其偏移量為其類型大小的整數(shù)倍;
示例1:
struct BF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
其內(nèi)存布局為:
|_f1__|__f2__|_|____f3___|____|
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
位域類型為char,第1個(gè)字節(jié)僅能容納下f1和f2,所以f2被壓縮到第1個(gè)字節(jié)中,而f3只能從下一個(gè)字節(jié)開始。因此sizeof(BF1)的結(jié)果為2。
3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實(shí)現(xiàn)有差異,VC6采取不壓縮方式,Dev-C++采取壓縮方式;
示例2:
struct BF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由于相鄰位域類型不同,在VC6中其sizeof為6,在Dev-C++中為2。
4) 如果位域字段之間穿插著非位域字段,則不進(jìn)行壓縮;
struct BF3
{
char f1 : 3;
char f2;
char f3 : 5;
};
非位域字段穿插在其中,不會(huì)產(chǎn)生壓縮,在VC6和Dev-C++中得到的大小均為3。
5) 整個(gè)結(jié)構(gòu)體的總大小為最寬基本類型成員大小的整數(shù)倍。
6. 聯(lián)合體的sizeof,結(jié)構(gòu)體在內(nèi)存組織上是順序式的,聯(lián)合體則是重疊式,各成員共享一段內(nèi)存,所以整個(gè)聯(lián)合體的sizeof也就是每個(gè)成員sizeof的最大值。