【问题标题】:Struct member alignment in C++/BoostC ++ / Boost中的结构成员对齐
【发布时间】:2015-02-04 09:14:34
【问题描述】:

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

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

Should boost library be dependent on structure member alignments?

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

一些问题:

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

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

【问题讨论】:

    标签: c++ visual-studio boost memory-alignment


    【解决方案1】:
    • 如果它因为字节对齐而崩溃,那是你的错。
    • boost 使用 #pragma pack 来保证正确性
    • 以不同的字节对齐方式编译会产生完全不同的汇编代码,因此您必须以相同的对齐方式编译所有库。
    • 如果您的 boost 项目是可视化的,则对齐在 Properties-> C/C+1-> Code Generation -> Struct Member Alignment 下。如果您使用其他工具,请查找如何向编译器提供选项并传递 /Zp1(或 -Zp1)。

    boost 将使用多个需要特定字节对齐的函数。这些函数可能来自 boost 框架本身或来自微软库。经典案例是需要最小字节对齐的原子操作(例如 InterlockedIncrement )。

    如果有结构

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

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

    【讨论】:

    • 我知道如何更改我们项目的对齐方式,但目前无法实现。所以我们想用其他对齐方式编译 Boost(使用 boost build - B2.exe。知道这是怎么做的吗?)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多