sizeof用來**求對(duì)象或者類型的大小巧勤。**下面列出sizeof十個(gè)特性:摘自([http://www.cppblog.com/w57w57w57/archive/2011/08/09/152845.html](http://www.cppblog.com/w57w57w57/archive/2011/08/09/152845.html))
(0)sizeof是運(yùn)算符项乒,不是函數(shù)鸡捐;
(1)sizeof不能求得void類型的長度;
(2)sizeof能求得void類型的指針的長度;
(3)sizeof能求得**靜態(tài)分配內(nèi)存的數(shù)組的長度**!
(4)sizeof不能求得動(dòng)態(tài)分配的內(nèi)存的大小!
(5)sizeof不能對(duì)不完整的數(shù)組求長度;
(6)當(dāng)表達(dá)式作為sizeof的操作數(shù)時(shí),**它返回表達(dá)式的計(jì)算結(jié)果的類型大小,**但是它不對(duì)表達(dá)式求值桂敛!
(7)sizeof可以對(duì)函數(shù)調(diào)用求大小,并且求得的大小等于返回類型的大小溅潜,但是不執(zhí)行函數(shù)體术唬!
(8)sizeof求得的結(jié)構(gòu)體(及其對(duì)象)的大小**并不等于**各個(gè)數(shù)據(jù)成員對(duì)象的大小之和!
(9)sizeof不能用于求結(jié)構(gòu)體的位域成員的大小滚澜,但是可以求得包含位域成員的結(jié)構(gòu)體的大写植帧!
sizeof函數(shù)總結(jié)
**sizeof函數(shù)功能:計(jì)算數(shù)據(jù)空間的字節(jié)數(shù)**
1.與strlen()比較
strlen計(jì)算**字符數(shù)組的字符數(shù)**设捐,以"\0"為結(jié)束判斷潦牛,不計(jì)算為'\0'的數(shù)組元素。
sizeof計(jì)算數(shù)據(jù)(包括數(shù)組挡育、變量巴碗、類型、結(jié)構(gòu)體等)所占內(nèi)存空間即寒,用字節(jié)數(shù)表示(當(dāng)然用在字符數(shù)組計(jì)算"\0"的大邢鹣)召噩。
**2.指針與靜態(tài)數(shù)組的sizeof操作**
指針均可看為變量類型的一種。所有指針變量的sizeof 操作結(jié)果均為4逸爵。
實(shí)例1::char *p;
sizeof(p)=4;
sizeof(*p) = 1; //相當(dāng)于sizeof(char);
實(shí)例2:
**對(duì)于靜態(tài)數(shù)組具滴,sizeof可直接計(jì)算數(shù)組大小师倔;**
例:int a[10];
char b[]="hello";
sizeof(a)等于4*10=40;
sizeof(b)等于6;
void fun(char p[])
{
sizeof(p); //等于4,數(shù)組做型參時(shí)构韵,數(shù)組名稱當(dāng)作指針使用!趋艘!
}
實(shí)例3(經(jīng)典考題):
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a為**指針**
cout<<sizeof(*a)<<endl; // 72 *a為一個(gè)有3*6個(gè)指針元素的**數(shù)組**
cout<<sizeof(**a)<<endl; // 24 **a為**數(shù)組一維的6個(gè)指針**
cout<<sizeof(***a)<<endl; // 4 ***a為**一維的第一個(gè)指針**
cout<<sizeof(****a)<<endl; // 8 ****a為**一個(gè)double變量**
問題解析:
a是一個(gè)很奇怪的定義疲恢,他表示一個(gè)指向double*[3][6]類型數(shù)組的指針。既然是指針瓷胧,所以sizeof(a)就是4显拳。
既然a是執(zhí)行double*[3][6]類型的指針,*a就表示一個(gè)double*[3][6]的多維數(shù)組類型搓萧,因此sizeof(*a)=3*6*sizeof(double*)=72杂数。
同樣的,**a表示一個(gè)double*[6]類型的數(shù)組瘸洛,sizeof(**a)=6*sizeof (double*)=24揍移。
***a就表示其中的一個(gè)元素,也就是double*了反肋,所以sizeof(***a)=4羊精。
****a,就是一個(gè)double了囚玫,所以sizeof(****a)=sizeof(double)=8。
3.格式的寫法
sizeof操作符读规,對(duì)變量或?qū)ο罂梢圆患永ㄌ?hào)抓督,但若是類型,須加括號(hào)束亏。
4.使用sizeof時(shí)string的注意事項(xiàng)
string s="hello";
sizeof(s)等于string類的大辛逶凇(32),sizeof(s.c_str())得到的是與字符串長度(4)碍遍。
5.union 與struct的空間計(jì)算
總體上遵循兩個(gè)原則:
(1)**整體空間**是**占用空間最大的成員(類型)所占字節(jié)的整數(shù)倍**
(2)數(shù)據(jù)**對(duì)齊原則**----數(shù)據(jù)在內(nèi)存中按照結(jié)構(gòu)成員**先后順序**進(jìn)行排序定铜,**當(dāng)排到該成員變量時(shí),其前面已擺放的空間大小必須是該成員類型大小的整倍數(shù)怕敬,如果不夠則補(bǔ)齊揣炕,以此向后類推。**
注意:數(shù)組按照單個(gè)變量一個(gè)一個(gè)的擺放东跪,而不是看成整體畸陡。如果成員中有自定義的類鹰溜、結(jié)構(gòu)體,也要注意數(shù)組問題丁恭。
在計(jì)算結(jié)構(gòu)體的sizeof時(shí)曹动,需要 先求出占用空間最大的成員(類型)所占字節(jié)來確定對(duì)齊的方式。
實(shí)例4:
因?yàn)閷?duì)齊問題使結(jié)構(gòu)體的sizeof變得比較復(fù)雜牲览,看下面的例子:(默認(rèn)對(duì)齊方式下)
struct s1
{
char a;
double b;
int c;
char d;
};
struct s2
{
char a;
char b;
int c;
double d;
};
cout<<sizeof(s1)<<endl; // 24
cout<<sizeof(s2)<<endl; // 16
同樣是兩個(gè)char類型墓陈,一個(gè)int類型,一個(gè)double類型第献,但是因?yàn)閷?duì)齊問題贡必,導(dǎo)致他們的大小不同。**計(jì)算結(jié)構(gòu)體大小可以采用元素?cái)[放法**痊硕,我舉例子說明一下:首先赊级,CPU判斷結(jié)構(gòu)體的對(duì)界,根據(jù)上一節(jié)的結(jié)論岔绸,s1和s2的對(duì)界都取最大的元素類型理逊,也就是double類型的對(duì)界8。然后開始擺放每個(gè)元素盒揉。
對(duì)于s1晋被,**首先把a(bǔ)放到8的對(duì)界,假定是0刚盈,此時(shí)下一個(gè)空閑的地址是1羡洛,但是下一個(gè)元素b是double類型,要放到8的對(duì)界上藕漱,離1最接近的地址是8了欲侮,所以b被放在了8,此時(shí)下一個(gè)空閑地址變成了16肋联,**下一個(gè)元素c的對(duì)界是4威蕉,16可以滿足,所以c放在了16橄仍,此時(shí)下一個(gè)空閑地址變成了20韧涨,下一個(gè)元素d需要對(duì)界1挡闰,也正好落在對(duì)界上茫叭,所以d放在了20肛根,**結(jié)構(gòu)體在地址21處結(jié)束兰吟。由于s1的大小需要是8的倍數(shù)撒遣,所以21-23的空間被保留褂策,s1的大小變成了24喉磁。**
對(duì)于s2碱茁,首先把a(bǔ)放到8的對(duì)界锁孟,假定是0育勺,此時(shí)下一個(gè)空閑地址是1但荤,下一個(gè)元素的對(duì)界也是1,所以b擺放在1涧至,下一個(gè)空閑地址變成了2腹躁;下一個(gè)元素c的對(duì)界是4,所以取離2最近的地址4擺放c南蓬,下一個(gè)空閑地址變成了8纺非,下一個(gè)元素d的對(duì)界是8,所以d擺放在8赘方,所有元素?cái)[放完畢烧颖,結(jié)構(gòu)體在15處結(jié)束,占用總空間為16窄陡,正好是8的倍數(shù)炕淮。
這里有個(gè)陷阱,**對(duì)于結(jié)構(gòu)體中的結(jié)構(gòu)體成員跳夭,不要認(rèn)為它的對(duì)齊方式就是他的大小涂圆,**看下面的例子:
實(shí)例5:
struct s1
{
char a[8];
};
struct s2
{
double d;
};
struct s3
{
s1 s;
char a;
};
struct s4
{
s2 s;
char a;
};
cout<<sizeof(s1)<<endl; // 8
cout<<sizeof(s2)<<endl; // 8
cout<<sizeof(s3)<<endl; // 9
cout<<sizeof(s4)<<endl; // 16;
s1和s2大小雖然都是8,但是s1的對(duì)齊方式是1(注意s1的大小8)币叹,s2是8(double)润歉,所以在s3和s4中才有這樣的差異。
所以颈抚,在自己定義結(jié)構(gòu)體的時(shí)候踩衩,如果空間緊張的話,最好考慮對(duì)齊因素來排列結(jié)構(gòu)體里的元素贩汉。
相關(guān)常數(shù):
sizeof int:4
sizeof short:2
sizeof long:4
sizeof float:4
sizeof double:8
sizeof char:1
sizeof p:4
sizeof WORD:2
sizeof DWORD:4
C\C++ sizeof 陷阱
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锭吨,“玉大人蠢莺,你說我怎么就攤上這事×闳纾” “怎么了躏将?”我有些...
- 文/不壞的土叔 我叫張陵锄弱,是天一觀的道長。 經(jīng)常有香客問我祸憋,道長会宪,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任蚯窥,我火速辦了婚禮掸鹅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拦赠。我一直安慰自己巍沙,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布荷鼠。 她就那樣靜靜地躺著句携,像睡著了一般。 火紅的嫁衣襯著肌膚如雪允乐。 梳的紋絲不亂的頭發(fā)上矮嫉,一...
- 文/蒼蘭香墨 我猛地睜開眼炊邦,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼编矾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馁害,我...
- 序言:老撾萬榮一對(duì)情侶失蹤窄俏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碘菜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凹蜈,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年忍啸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仰坦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布庶近,位于F島的核電站,受9級(jí)特大地震影響眷蚓,放射性物質(zhì)發(fā)生泄漏鼻种。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一溪椎、第九天 我趴在偏房一處隱蔽的房頂上張望普舆。 院中可真熱鬧,春花似錦校读、人聲如沸沼侣。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾洛。三九已至,卻和暖如春雁芙,著一層夾襖步出監(jiān)牢的瞬間轧膘,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓洞焙,卻偏偏與公主長得像蟆淀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澡匪,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- C語言中宏是一個(gè)很好的工具熔任,但也容易引起錯(cuò)誤。 1. 宏不是函數(shù) 請(qǐng)注意宏定義中的括號(hào)唁情,它們的作用就是預(yù)防引起與優(yōu)...
- 判斷C語句疑苔,要從結(jié)合性和優(yōu)先級(jí)兩個(gè)角度一起考慮。 單目運(yùn)算符是所有的真正意義上的運(yùn)算符終甸鸟,優(yōu)先級(jí)最高的惦费。*p++會(huì)...
- C陷阱與缺陷第一章提到詞法分析的“貪婪法”,一時(shí)興起就在機(jī)器上驗(yàn)證一下抢韭,猛然想到以前看過GCC與clang的一些資...
- 縱使你不愛我了薪贫,你依舊給了我最美的時(shí)光。只要我不頹廢地對(duì)待生活篮绰、不浪費(fèi)生命后雷,縱然這份暗戀有點(diǎn)苦季惯,可命運(yùn)必將用另一種...
- 2017年9月4日 早上6點(diǎn)多醒來吠各,看了一眼手機(jī)臀突,在意識(shí)里,總記得昨晚有在充電贾漏,但是事實(shí)是沒有候学,我打開手機(jī),手機(jī)界...