繁体   English   中英

C ++ / Boost中的结构成员对齐

[英]Struct member alignment in C++/Boost

我们有一个使用/Zp1编译的项目,这是由于遗留问题导致的,目前无法更改。 我们开始通过NuGet(软件包系统)使用Boost,但很快收到对齐警告和崩溃。 这些库是使用默认( /Zp8 )编译器选项构建的。

我已经阅读了有关ABI的文章,并在StackOverflow上找到了类似的问题,但仍然有一些问题。

Boost库是否应该依赖于结构成员的对齐方式?

http://www.boost.org/development/separate_compilation.html

一些问题:

  • 我注意到Boost使用#pragma pack消息进行字节对齐(兼容性?)。 Boost是否应该以不同的字节对齐方式工作? 如果由于字节对齐而导致崩溃,是否应该提交错误?

  • 如何用/Zp1编译Boost? 在哪里添加编译器选项? 它在project-config.jam文件中吗? 有什么例子吗?

  • 如果它由于字节对齐而崩溃,那是您的错。
  • boost使用#pragma pack来确保正确性
  • 使用不同的字节对齐方式进行编译会产生完全不同的assbyby代码,因此您必须使用相同的对齐方式来编译所有库。
  • 如果您在视觉上拥有boost项目,则对齐方式位于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM