在c中内存对齐和cpu 有关,下面我们以32为处理器为例来详解:
#pragma pack()
这是一个特别的宏 他可以动态的改变对齐基数;
c 中数组无论是自对其还是数组对齐 都是已pack 宏和他的最大成员变量 的最小值 为对齐参数。
数组对齐原则:
1. 成员是变量 按照自身和pack 最小的值(对齐基数)对齐,及他的开始地址为对齐基数的整数倍。
2. 如果成员变量中含有 结构体或联合体,对齐基数为他的成员中最大值和pack两者中的最小为对齐基数。 他的开始地址必须为这个值得正数倍。
3. 数组自对齐 数组成员中最大值和pack两者中最小值为对齐基数 他的大小必须为对齐基数的整数被
eg:
typedef struct test
{
int a; // 自对齐基数 4
char b; //自对其基数 1
int c; // 自对其基数 4
} test_1; // 数组自对其基数 4
typedef struct test_b
{
int aa; // 自对齐基数4
char bb; // 自对齐基数 1
test_1 cc; // 自对齐基数 4 (党成员为数组时 对齐基数为 他的机构体中最大的成员对齐基数)
char dd; // 自对其基数 1
}test_2; // 数组自对其基数 4 (成员中最大的和pack中最小的那个)
printf("---------->> the test_1 len is =%d\n",sizeof(test_1));
printf("---------->> the test_2 len is =%d\n",sizeof(test_2));
输出为: 12 , 24