1、#pragma(n)和#pragma pack()
#pragma pack(1) /* 1字节对齐 */
struct test
{
int a;
char b;
int c;
short d;
};
#pragma pack() /* 还原默认对齐 */
结论1:#pragma(n)和#pragma pack()一起用是在这期间保证n字节对齐,而且要成对存在
#pragma(push)和#pragma(pop)
#pragma(push):push是"压入"的意思。编译器编译到这个地方是保持对齐状态(也就是保存push之前的状态)
#pragma(pop):pop是"弹出"的意思。编译器编译到此处时恢复push指令前的保存的对齐状态
#include <stdio.h>
#pragma pack(2)
#pragma pack(push)
#pargma pack(4)
struct CC{
double d;
char b;
int a;
short c;
};
#pragma pack(1)
struct BB{
double d;
char b;
int a;
short c;
};
#pragma pack(pop)
struct AA{
double d;
char b;
int a;
short c;
};
int main()
{
printf("%u\n%u\n%u\n",sizeof(struct AA),sizeof(struct BB),sizeof(struct CC));
return 0;
}
编译结果:
20
15
16
解析:先保证2字节对齐,然后push保存2字节对齐。然后又强制4字节对齐,打印CC结构体为20字节对齐,然后强制1字节对齐,打印BB结构体为15字节对齐,然后pop,编译器会恢复到push保存的2字节对齐状态,打印AA结构体为16字节对齐
结论2:#pragma(push)和#pragma(pop)期间不受外接对齐条件影响,而且要成对存在
总结
结论1:#pragma(n)和#pragma pack()一起用是在这期间保证n字节对齐,而且要成对存在
结论2:#pragma(push)和#pragma(pop)期间不受外接对齐条件影响,而且要成对存在