資源描述:
《GCC下結構體內(nèi)存對齊問題》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、引言:結構對齊的目的是為了加快CPU取數(shù)據(jù)時的速度,不同的編譯器有不同的標準,有關于4字節(jié)對齊的,也有關于8字節(jié)對齊的,解題時需跟據(jù)環(huán)境具體分析。
環(huán)境:ubuntu10.10gcc
判斷結構大小,只需要注意兩點即可:
1.分析結構成員:
小于4字節(jié)的結構成員,相對起始地址要在成員大小的倍數(shù)上
Char1char類型可以從任何地址開始
Short2short類型需要相對結構起始地址以2的倍數(shù)處開始
Int4
大于44對齊如double大小為8字節(jié),只需按4字節(jié)對齊即可
2.整個結構要關于最大的成員大小對齊(不大于4)
如果結構最大的成員是short那么結構的大小應是2的倍
2、數(shù),(不足時在結構末尾補足)
如果最大成員是int,則應是4的倍數(shù)。
如果是double,則是4的倍數(shù)。
為什么是4的倍數(shù)?
這是GCC默認的對齊大小,可以修改。VC下應該默認是8。
測試,以下結構的大小是?
structcom
{
charc1;1字節(jié)由下面的對齊知道占用了4字節(jié)
longtt;關于4字節(jié)對齊占用了4字節(jié)
intc9;關于4字節(jié)對齊占用了4字節(jié)
shortc3;關于2字節(jié)對齊占用了4字節(jié)
doublec4;關于4字節(jié)對齊占用了8字節(jié)
};4的倍數(shù),所以大小共24字節(jié)。
structT
{
chara;
doubleb;
};
structTT
{
shorta
3、;
charb;
shortaa;
};
structA
{
charc;
doubled;
shorts;
charsf[5];
};
structB
{
shorts;
charsf[5];
charc;
doubled;
};
structC
{
charc;
shorts;
charsf[5];
doubled;
};
structD
{
doubled;
charsf[5];
shorts;
charc;
};
structE
{
charc;
charsf[5];
doubled;
shorts;
};#includestructA{//QT/
4、Cfree下GCC下charc;//8byte4doubled;//8byte8shorts;//7byte4charsf[5];//24}a1;//24structB{shorts;//7byte2charsf[5];//05charc;//1byte1doubled;//8byte8}a2;//16structC{charc;//2byte1shorts;//7bytecharsf[5];//7doubled;//8byte}a3;//24structD{doubled;//13bytecharsf[5];//1shorts;//2bytecharc;//8byte}a4;in
5、tmain(){/*a.c='a';a.d=5.2356;a.s=3;//a.sf[5]="xuwe";不能這樣賦值*/printf("%d",sizeof(a1));printf("%d",sizeof(a2));printf("%d",sizeof(a3));printf("%d",sizeof(a4));//structAa1={'a',5.2356,3,"xuwe"};printf("%d",&a1.c);printf("%d",&a1.d);printf("%d",&a1.s);printf("%d",&a1.sf[5]);printf("
6、");printf("%d",&a2.s);printf("%d",&a2.sf[5]);printf("%d",&a2.c);printf("%d",&a2.d);printf("");printf("%d",&a3.c);printf("%d",&a3.s);printf("%d",&a3.sf[5]);printf("%d",&a3.d);printf("");printf("%d",&a4.d);printf("%d",&a4.sf[5]);printf("%d",&a4.s);printf("%d",&a4.c)
7、;printf("");return0;}