#pragma pack设置后,整个程序的字节对齐规则都会应用吗
#pragma pack不会让整个程序的所有代码都应用同一对齐规则。它的作用范围是受当前编译单元中该指令出现位置之后所定义的结构体/联合体影响并且不会跨翻译单元.cpp文件传播。具体作用范围从指令出现的位置开始到文件末尾或遇到另一个#pragma pack()恢复默认或#pragma pack(pop)为止。仅影响当前.cpp文件包括该位置之后#include的头文件。不同的.cpp文件彼此独立– 在 A.cpp 中写#pragma pack(1)B.cpp 中若没有该指令则 B.cpp 中的结构体仍按编译器默认对齐。示例说明// common.hstructMyStruct{chara;intb;};// 默认对齐// file1.cpp#includecommon.h#pragmapack(1)structPackedStruct{chara;intb;};// 按1字节对齐#includecommon.h// 这里再次包含会让 MyStruct 也变成1字节对齐小心需要注意的是如果头文件在#pragma pack生效时被包含那么该头文件中的所有结构体也会采用当前的对齐规则。因此通常建议在头文件内部使用push/pop对避免污染其他包含点。正确用法避免副作用// MyHeader.h#pragmapack(push,1)structMyPackedStruct{chara;intb;};#pragmapack(pop)// 恢复之前的对齐这样无论谁包含MyHeader.hMyPackedStruct都是紧凑排列而该头文件之外的代码不受影响。结论#pragma pack不是全局设置它的作用域是编译单元内的代码区域。想要在整个程序多个.cpp中都采用相同非默认对齐需要在每一个使用相关结构体的编译单元中通常通过统一的头文件 push/pop都进行设置。若你在一个.cpp中设置了pack但没有恢复它会影响该文件后面的所有结构体定义但绝不会跑到另一个.cpp中。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2564431.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!