#pragma pack(push,1)的一个副作用
来源:互联网 发布:淘宝网上修手机靠谱吗 编辑:程序博客网 时间:2024/05/18 01:09
在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)即可恢复默认的内存对齐
- #pragma pack(push,1)的一个副作用
- #pragma pack(push,1)的一个副作用
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1)与#pragma pack(1)的区别
- #pragma pack(push,1) & #pragma pack(pop)
- #pragma pack 与#pragma pack(push,1)
- JUnit的assert方法
- eclipse3.7安装svn插件
- C# List<T>用法
- 软件质量管理
- 光传感器和距离传感器TMD22713源代码执行过程分析
- #pragma pack(push,1)的一个副作用
- Servlet 工作原理解析
- 二叉树
- 【Java】 int 补零,输出为 0001
- Frame Based Sprite Animation in Silverlight
- ArrayList的使用方法
- ODBC连Oracle数据库报错,SQLState=IM004
- Ogre的四元数组Quaternion类
- 深入分析 Java 中的中文编码问题