內存對齊
1.說明:
- 第一個成員起始於0偏移處
每個成員按其指定大小和指定對齊參數n中較小的一個進行對齊
1.偏移地址和成員佔用大小均需對齊
2.結構體成員對齊參數爲其所有成員使用對齊參數的最大值結構體總長度必須爲所有對齊參數的整數倍
2.示例說明:
示例1:
說明:默認爲#pragma pack(4),也就是按4個字節大小對齊
struct test
{
char c1;//大小:1 對齊:4 起始位置:0 大小:1 空白:0
short s;//大小:2 對齊:4 起始位置:2 大小:2 空白:1
char c2;//大小:1 對齊:4 起始位置:4 大小:1 空白:0
int i; //大小:4 對齊:4 起始位置:8 大小:4 空白:3
}; //結構體大小爲上面的所有對齊參數的整數倍
int main()
{
printf("%d\n", sizeof(struct test)); //結果爲12(2+2+4+4)
return 0;
}
- 示例2:
#pragma pack(8) //按8個字節大小對齊,linux下默認4字節對齊,會直接忽略此條語句
struct s1
{
short a;//大小:2 對齊:8 起始位置:0 大小:2 空白:0
long b; //大小:4 對齊:8 起始位置:4 大小:4 空白:2
};
//這裏的long是32位編譯器的結果,編譯器不同結果不同
struct s2
{
char c; //大小:1 對齊:8 起始位置:0 大小:1 空白:0
struct s1 d;//大小:4 對齊:8 起始位置:4 大小:8 空白:3
double e; //大小:8 對齊:8 起始位置:16 大小:8 空白:4
};
//結構體裏面有結構體的對齊方式是取裏面的結構體對齊數的最大的
int main()
{
struct s2 s;
printf("%d\n", sizeof(struct s1)); //8
printf("%d\n", sizeof(struct s2)); //24
printf("%d\n", (int)&(s.d) - (int)&(s.c)); //4
return 0;
}