设置编译器的内存对齐方式(C++)

项目开发过程当中常常会遇到,同一个结构体在两个工程中使用,好比api和后台服务。为了通讯一致,两处固然要有彻底一致的结构体定义。
可是有时候,明明看到两处结构体定义同样,可是api传过来的结构体,后台服务解析(通常是强转)出乱码。后面通过仔细排查,才看到后台服务定义该结构体的头文件中有以下代码:api

#pragma  pack (push,1)		//设置1字节对齐

//结构体定义在此处。。。。

#pragma pack(pop)			//取消1字节对齐

而在api的工程中,没有像上面这样来定义该结构体。两处定义出现了不一致,致使解析出错。
而上面代码是什么意思呢?
在缺省状况下,C编译器为每个变量或是数据单元按其天然对界条件分配空间。通常地,能够经过下面的方法来改变缺省的对界条件:spa

  • 使用伪指令#pragma pack(push, n),C编译器将按照n个字节对齐。
  • 使用伪指令#pragma pack(pop),取消自定义字节对齐方式。

好比两种结构体定义方式:code

struct sample1
{
	char a;
	int b;
};

#pragma pack(push,1)
struct sample2
{
	char a;
	int b;
};
#pragma pack(pop)

单从字面上看,sizeof(sample1)==sizeof(sample2)。
实际上,结构体sample1按照天然对界对齐(按照int的长度,4字节对齐),sizeof(sample1)=4+4=8
结构体sample2按照设定的对齐方式对齐(1字节对齐),sizeof(sample2)=1+4=5
固然你把sample1强转成sample2,会产生字节错位,形成乱码。这是一个经验教训,切记!!开发

相关文章
相关标签/搜索