一. 何时使用
#pragma pack(1)的用法大多是在结构体中
二. 为什么使用#pragma pack(1)
结构体的字节对齐方式在不同的编译器中不同,会存在数据冗余,以下举个例子:
struct example
{
char header_start;
double data_type;
};
现有的结构体中,就会按照结构体成员中最大的数据类型对齐,例子当中就是double,按照8个字节进行对齐。那么此时size of(example)就是16,存在7个空字节,因为其中char只占1个字节
如果加上#pragma pack(1),那么example按1个字节方式对齐,此时size of(example)就是等于9
三. 注意点
这种方法的使用一定是要成对使用,如下面例子:
#pragma pack(1)
struct example
{
char header_start;
double data_type;
};
#pragma pack()
我们一定要在结构体末尾加上#pragma pack()进行取消自定义字节对齐的命令,如果不取消,可能会导致整个程序存在问题,因为会影响到其他结构体的字节对齐方式
四. #pragma pack()的一些用法
#pragma pack(show) //显示当前内存对齐的字节数,编辑器默认8字节对齐
#pragma pack(n) //设置编辑器按照n个字节对齐,n可以取值1,2,4,8,16
#pragma pack(push) //将当前的对齐字节数压入栈顶,不改变对齐字节数
#pragma pack(push,n) //将当前的对齐字节数压入栈顶,并按照n字节对齐
#pragma pack(pop) //弹出栈顶对齐字节数,不改变对齐字节数
#pragma pack(pop,n) //弹出栈顶并直接丢弃,按照n字节对齐