在C/C++头文件中使用pragma pack修改了字节对齐的时候,如果没有恢复,会对包含该头文件的所有文件起作用,带来不可预料的后果。

例如,在头文件 packed.h 中某处 加入 #pragma pack(1), 另有A.h B.h, 对应的实现文件为 A.cpp, B.cpp.

A.h:

#include "packed.h"  // contains #pragma pack(1)
#include "B.h"

class A{
...
private:
  B b;
  C c;
}

在B.h中未 include “packed.h”

此时,B 在A中占据的内存大小实际小于 B.cpp中B的大小(被packed.h的字节对齐设置影响), 那么,A.cpp调用 B的成员函数时,B的成员函数可能会修改A中B所占内存之外的空间, 在上面这个例子中,也就是可能把C c的内存区域给修改了。

因此,在使用 #pragma pack(n)时,要注意恢复原来的字节对齐设置,具体做法:

packed.h:

#pragma pack(push)
#pragma pack(1)
...
// restore
#pragma pack(pop)
#endif /* of packed.h */