[英]Struct member alignment in C++/Boost
我们有一个使用/Zp1
编译的项目,这是由于遗留问题导致的,目前无法更改。 我们开始通过NuGet(软件包系统)使用Boost,但很快收到对齐警告和崩溃。 这些库是使用默认( /Zp8
)编译器选项构建的。
我已经阅读了有关ABI的文章,并在StackOverflow上找到了类似的问题,但仍然有一些问题。
http://www.boost.org/development/separate_compilation.html
一些问题:
我注意到Boost使用#pragma pack消息进行字节对齐(兼容性?)。 Boost是否应该以不同的字节对齐方式工作? 如果由于字节对齐而导致崩溃,是否应该提交错误?
如何用/Zp1
编译Boost? 在哪里添加编译器选项? 它在project-config.jam文件中吗? 有什么例子吗?
#pragma pack
来确保正确性 Properties-> C/C+1-> Code Generation -> Struct Member Alignment
之下。 如果您使用其他工具,请找到如何向编译器提供选项并传递/Zp1
(或-Zp1
)。 boost将使用多个功能,这些功能需要特定的字节对齐。 这些功能可能来自boost框架本身,也可能来自Microsoft库。 最典型的情况是原子操作(例如InterlockedIncrement ),它需要最小的字节对齐。
如果有结构
struct
{
char c;
int a;
volatile int b;
}
并且b
用作原子操作数,必须使用#pragma pack
保证结构成员的对齐。 因此,请使用露骨的#pragma pack
来确保正确性 。
如果您发现崩溃是因为Boost和您的项目都是以非标准但均等的对齐方式进行编译的,那么您可能要报告该错误。 Boost应该主要与对齐方式无关,并在真正重要的情况下使用显式对齐控制。 但是,请不要报告性能问题,也不要报告平台访问不当导致崩溃的问题。
如果由于使用与自己的代码不同的对齐方式编译Boost导致崩溃,那是您自己的错。 如果您无法更改项目,请以相同的对齐方式重新编译Boost。
另外,您应该真正朝着可以更改项目的方向努力,因为使用非默认对齐方式进行编译是一个非常糟糕的主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.