结构构件对齐方式C++/提升
Struct member alignment in C++/Boost
我们有一个使用 /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。
此外,您应该真正朝着可以更改项目的方向努力,因为使用非默认对齐方式进行编译是一个非常糟糕的主意。
- 在提升multi_index容器中,是否定义了"default index"?
- 提升 ASIO 无法识别计时器对象
- 提升精神:解析布尔表达式并简化为规范范式
- 如何克服提升精神AST混乱
- 缓慢提升ASIO
- 我可以把基础班提升为儿童班吗
- 提升反序列化对象具有 nan 或 -nan 值
- 在 Mac 上的 python 上提升
- 提升 Asio TCP 服务器 处理多个客户端
- 使用提升将数据从 PyObject 复制到浮点数 *
- 是否可以配置提升日志刷新?
- 提升精神 x3 - 懒惰解析器
- 提升几何体:C++并集多个多边形
- 提升几何体:assertion_failed错误C++
- 提升 ASIO - io_service 不要等待连接到线程
- 提升 1.64 单元测试编译失败
- 每次进行继承时都需要提升::序列化::base_object吗?
- 提升图广度优先搜索前置编译错误
- 提升,以分钟精度获得 UTC 时间
- 在提升::bimap中移位值