字節對齊

對結構體而言,編譯器會自動進行字節對齊的。
字節對齊的值可以爲1, 2, 4, 8, 16。
具體的取值,視不同的編譯器爲不同。就我現在用的VS2005來說,默認是4。也就是說,如果結構體大小,不是4的整數倍,會自動補齊爲4的整數倍。

在32位編譯器下

struct test
{
int m1; //4字節
char m2; //1字節
float m3; //4字節
union uu //8字節
{
char u1[5];
int u2[2];
}ua;

}myaa;

也就是說,myaa的原始大小爲17字節,所以如果字節對齊設置爲4的話,那麼sizeof( myaa )就是20,
當字節對齊爲1時,sizeof( myaa )就是原始值17。

可以通過#pragma pack編譯選項來改變字節對齊的值。

比如


//將原先的字節對齊入棧,並設置當前字節對齊爲1
#pragma pack( push, 1 )

struct test
{
int m1;
char m2;
float m3;
union uu
{
char u1[5];
int u2[2];
}ua;

}myaa;

//出棧,恢復原先的字節對齊
#pragma pack( pop )


這樣子,在代碼中的sizeof(myaa)就是17

一般情況下,沒有必要改變默認的字節對齊,在特殊情況下可以使用,比如用於網絡傳輸的結構體,爲了節約傳輸大小,可以這麼做。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章