作者:向日葵一样2502932413 | 来源:互联网 | 2023-02-11 17:20
(提前抱歉没有设法将我的问题减少到简单的失败测试用例...)
我遇到了升级到GCC 6.3.0以构建我们的代码库(相关标志:)的问题-O3 -m32
.
具体来说,由于GCC优化,我的应用程序会在struct ctor调用中进行段错误.
在这个ctor中,GCC使用了movaps
:
movaps %xmm0,0x30a0(%ebx)
movaps
要求操作数为16字节对齐.但是在这个时间%ebx
点,指向我的对象,不一定是16字节对齐.来自glibc:
"在GNU系统中,malloc或realloc返回的块的地址总是八的倍数(或64位系统上的十六个)."
因此segfault(建立时-O3 -m32
).
为什么GCC假设分配的对象是16字节对齐?我误会了什么吗?
笔记:
此结构上没有对齐提示或属性
对象已通过默认new
运算符初始化
取决于优化水平:
通过: -m32 -O2
失败: -m32 -O2 -ftree-slp-vectorize
通过: -m32 -O3 -fno-tree-slp-vectorize
失败: -m32 -O3
这个其他项目似乎遇到了类似的问题:https://github.com/godotengine/godot/issues/4623
他们的调查指向-fvect-cost-model=dynamic
.调查我的代码库而不是指向-ftree-slp-vectorize
.