结构构件对齐方式C++/提升

Struct member alignment in C++/Boost

本文关键字:提升 C++ 方式 构件 对齐 结构      更新时间:2023-10-16

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

我已经阅读了有关ABI的信息,并在StackOverflow上发现了类似的问题,但仍然有一些问题。

提升库应该依赖于结构成员对齐吗?

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

一些问题:

  • 我注意到 Boost 使用 #pragma 打包消息进行字节对齐(兼容性?Boost 应该使用不同的字节对齐方式吗?如果我由于字节对齐而可以重现崩溃,我应该提交错误吗?

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

  • 如果由于字节对齐而崩溃,那是您的错。
  • 提升使用#pragma pack确保正确性
  • 使用不同的字节对齐方式进行编译会产生完全不同的组合代码,因此您必须使用相同的对齐方式编译所有库。
  • 如果您在视觉中具有增强项目,则对齐方式处于Properties-> C/C+1-> Code Generation -> Struct Member Alignment .如果使用其他工具,请查找如何向编译器提供选项并传递/Zp1(或-Zp1)。

boost将使用多种函数,这需要特定的字节对齐。这些函数可能来自 boost 框架本身或来自 Microsoft 库。典型的情况是原子操作(即像互锁增量),它需要最小的字节对齐。

如果有结构

struct
{
  char c; 
  int a;
  volatile int b;
}

并且b用作原子操作数,则必须使用#pragma pack来保证结构成员对齐。因此,boost 使用显式#pragma pack以确保正确性

如果您发现崩溃是因为 Boost 和您的项目都是使用非标准但相同的对齐方式编译的,那么您可能想要报告一个错误。Boost 应该主要与对齐无关,并且应该在真正重要的情况下使用显式对齐控制。但不要报告性能问题,也不要报告访问不一致导致崩溃的平台上的问题。

如果您因为编译 Boost 时使用与您自己的代码不同的对齐方式而崩溃,那是您自己的错。如果无法更改项目,请使用相同的对齐方式重新编译 Boost。

此外,您应该真正朝着可以更改项目的方向努力,因为使用非默认对齐方式进行编译是一个非常糟糕的主意。