现在的位置: 首页 > 综合 > 正文

#pragma pack(push,1)的一个副作用

2013年08月29日 ⁄ 综合 ⁄ 共 656字 ⁄ 字号 评论关闭

在C++中,定义通信协议的.h头文件,有时候会使用#pragma pack(push,1)来修改数据结构成员的内存对齐方式(为1个字节对齐)

假设现在有Package.h

 

//Filename: package.h

#pragma pack(push,1)

struct cmd_test

{

    int  iFlag1;

    char szName[32];

}

//...

#pragma pack(pop,1)

 

如果在其他C++头文件中引用package.h,要注意package.h所处的顺序对于其他引用的头文件是有影响(在VS2010下的实际结果)

根据实测得出的一个结论 include "package.h" 最好放在include第一行的,

否则如果放在其他include的中间,可能会影响其他头文件定义的对象的堆或栈的内存布局,甚至是引起heap crash或 stack corrupt。

例如:

//Filename:transmit.h

#pragma once

#include "otherhead1.h"

#include "package.h"

#include "Otherhead2.h"

 

//......

 

上述的顺序,可能导致Otherhead2.h中定义的对象的数据成员数据异常或者函数堆栈被破坏。

保险的做法是将package.h放在include的第一行。

 

==========================

补充问题真相, #pragma pack(pop,1) 是错误的用法,

#pragma pack(pop)即可恢复默认的内存对齐

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.