是否有任何优化选项,可以改变结构的对齐在VS2012



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

编译器优化选项会导致这个问题吗?为什么设置/Zp选项为8,这应该是默认的,改变类的布局?

谢谢

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

您可以使用__declspec( align( # ) ) declarator语法在敏感结构上以编程方式控制这一点,详细信息请参见这里。对于敏感的数据结构使用它,然后您可以在不改变结构的情况下将代码从Debug更改为Release。

最新更新