字节对齐
原理分析
字节对齐的准则:
1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
- Vc 编译器默认是 #pragma pack(8)
- gcc 默认是 #pragma pack(4),并且 gcc 只支持 1 / 2 / 4对齐。
- 套用三原则里计算的对齐值是不能大于 #pragma pack(value) 指定的 value 值。
实践验证
硬件平台:x86、64bit
软件平台:windows
编译器:TDM-GCC 4.9.2 64-bit Release
#include <stdio.h>
int main()
{
char *A;
char *B[20];
char *C[20][20];
int (*D)[10];
printf("sizeof(A) = %d\n", sizeof(A));
printf("sizeof(B) = %d\n", sizeof(B));
printf("sizeof(C) = %d\n", sizeof(C));
printf("sizeof(D) = %d\n", sizeof(D));
struct str1 {
char a;
double b;
int c;
} p1;
printf("sizeof(p1) = %d\n", sizeof(p1));
struct str2 {
double a;
char b;
int c;
} p2;
printf("sizeof(p2) = %d\n", sizeof(p2));
#pragma pack(1) // 指定字节对齐值
struct str3 {
double a;
char b;
int c;
} p3;
#pragma pack(pop) // 恢复字节对齐值
printf("sizeof(p3) = %d\n", sizeof(p3));
return 0;
}
输出结果
sizeof(A) = 8
sizeof(B) = 160
sizeof(C) = 3200
sizeof(D) = 8
sizeof(p1) = 24
sizeof(p2) = 16
sizeof(p3) = 13
==================================================