c++ - 是否有任何优化选项可以更改 VS2012 中结构的对齐方式?

标签 c++ visual-studio-2012 memory-alignment

这周我一直在调查一个奇怪的错误。当我在 Release 中编译第三方静态库然后将它与我的应用程序链接(也在 Release 中)时,它会因奇怪的调用堆栈而崩溃(即使它正在调用基类函数,this 指针也会发生变化,并最终在它尝试时崩溃访问成员(member))。昨天,我终于找到了根本原因:我正在使用的类的内存布局在库中与在我的应用程序中不同(通过/d1reportAllClassLayout 验证)。它以一种奇怪的方式不同,即在基类之后,库中有一个 4 + 8 字节的填充,但在我的应用程序中,有一个 12 字节的填充。另外,基类似乎有点短,因为基类的末尾和子类的第一个成员之间有 16 个字节 (IIRC) 的差异。当我在我的应用程序中强制填充到 8 个字节(/Zp8 选项)时,问题就解决了,这已经在库中完成了。只有这样,这两个类(class)才具有相同的布局。更奇怪的是,当我在 Debug 中编译时,这个错误完全不存在。

编译器优化选项会导致这种情况吗?为什么将/Zp 选项设置为默认值 8 会更改类的布局?

谢谢

最佳答案

是的,编译器优化绝对可以改变这一点。为了加快速度,编译器通常会对结构和变量进行字对齐,以便更快地移动它们(这种情况在 x64 系统上更常见)。这可能会导致您所看到的错误类型(其中 Struct 可以在发布和调试之间更改大小,因为它在内部重新排列元素以达到单词对齐)。

您可以使用 __declspec( align( # ) ) 声明符 语法以编程方式控制敏感结构,详细信息 here .将其用于敏感数据结构,然后您可以在不更改结构的情况下将代码从调试更改为发布。

关于c++ - 是否有任何优化选项可以更改 VS2012 中结构的对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468578/

相关文章:

c# - 从类库创建 vsix 包

c++ - 告诉 C++ 指针数据是 16 字节对齐的

ios - 从 NSDataAsset 读取时偶尔崩溃

c++ - 错误 : ‘sc_unit’ was not declared in this scope (SystemC-2. 3.0)

c++ - 将变量导入 DLL

c# - .NET DLL运行时依赖项

c# - C# 结构体参数和局部变量默认对齐吗?

c++ - 快速排序中的交换功能给出错误的输出

请求从 C++ 到非标量类型的转换

c++ - Python 比 C++ 更快更轻吗?