- 定義:sizeof 是一個操作符(operator),其作用是返回一個對象或類型所占的內(nèi)存字節(jié)數(shù)限匣。
其返回值類型為size_t抖苦。(size_t在頭文件stddef.h中定義,它依賴于編譯系統(tǒng)的值米死,一般定義為 typedef unsigned int size_t;) - 語法:sizeof有三種語法形式:
1) sizeof (object); //sizeof (對象)
2) sizeof object; //sizeof 對象
3) sizeof (type_name); //sizeof (類型)
對象可以是各種類型的變量睛约,以及表達式(一般sizeof不會對表達式進行計算)。
sizeof對對象求內(nèi)存大小哲身,最終都是轉(zhuǎn)換為對對象的數(shù)據(jù)類型進行求值。
sizeof (表達式); //值為表達式的最終結(jié)果的數(shù)據(jù)類型的大小
int i;
sizeof(int); //值為4
sizeof(i); //值為4贸伐,等價于sizeof(int)
sizeof i; //值為4
sizeof(2); //值為4勘天,等價于sizeof(int),因為2的類型為int
sizeof(2 + 3.14); //值為8捉邢,等價于sizeof(double)脯丝,因為此表達式的結(jié)果的類型為double
- 基本數(shù)據(jù)類型的sizeof
這里的基本數(shù)據(jù)類型是指short、int伏伐、long宠进、float、double這樣的簡單內(nèi)置數(shù)據(jù)類型藐翎。
由于它們的內(nèi)存大小是和系統(tǒng)相關(guān)的材蹬,所以在不同的系統(tǒng)下取值可能不同。
(32位系統(tǒng)下)Size of char : 1吝镣;Size of int : 4堤器;Size of short int : 2;Size of long int : 4末贾;Size of float : 4闸溃;Size of double : 8; Size of *p : 4(指針); - 結(jié)構(gòu)體的sizeof
為什么需要字節(jié)對齊辉川?計算機組成原理教導(dǎo)我們這樣有助于加快計算機的取數(shù)速度表蝙,否則就得多花指令周期了。為此乓旗,編譯器默認會對結(jié)構(gòu)體進行處理(實際上其它地方的數(shù)據(jù)變量也是如此)府蛇,讓寬度為2的基本數(shù)據(jù)類型(short等)都位于能被2整除的地址上,讓寬度為4的基本數(shù)據(jù)類型(int等)都位于能被4整除的地址上寸齐,依次類推欲诺。這樣,兩個數(shù)中間就可能需要加入填充字節(jié)渺鹦,所以整個結(jié)構(gòu)體的sizeof值就增長了扰法。
字節(jié)對齊的細節(jié)和編譯器的實現(xiàn)相關(guān),但一般而言毅厚,滿足三個準則:
1) 結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除塞颁。
2) 結(jié)構(gòu)體的每個成員相對于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要吸耿,編譯器會在成員之間加上填充字節(jié)(internal adding)祠锣。
3) 結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要咽安,編譯器會在最末一個成員后加上填充字節(jié)(trailing padding)伴网。
注意:空結(jié)構(gòu)體(不含數(shù)據(jù)成員)的sizeof值為1。試想一個“不占空間“的變量如何被取地址妆棒、兩個不同的“空結(jié)構(gòu)體”變量又如何得以區(qū)分呢澡腾,于是,“空結(jié)構(gòu)體”變量也得被存儲糕珊,這樣編譯器也就只能為其分配一個字節(jié)的空間用于占位了动分。