【发布时间】:2023-04-01 22:01:01
【问题描述】:
我使用__int128 作为结构的成员。
它适用于 -O0 查找(无优化)。
但是,如果启用优化,它会因段错误而崩溃 (-O1)。
它在指令 movdqa 处崩溃,该指令需要 var 对齐 16。
而地址是由malloc() 分配的,它只对齐8。
我尝试通过-mno-sse禁用SSE优化,但编译失败:
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:27:1: error: SSE register return with SSE disabled
如果我想同时使用__int128 和-O1 该怎么办?
提前致谢 吴
顺便说一句,如果__int128 仅用于堆栈(而不是堆)似乎没问题。
==== 编辑 ====
对不起,我没有说实话。
其实我没有使用malloc()。我使用了一个内存池库,它返回由 8 对齐的地址。
我说malloc()只是想让事情变得简单。
经过测试,我知道malloc() 对齐 16。__int128 成员在结构中也对齐 16。
所以问题只是我的内存池库。
非常感谢。
【问题讨论】:
-
对于 x86-64,
alignof(maxalign_t) == 16所以malloc总是返回 16 字节对齐的指针。听起来您的malloc已损坏,如果用于long double也会违反 ABI。malloc保证对齐到足以容纳任何标准类型。这不能是 32 位代码,因为 gcc 在 32 位目标中不支持__int128。 -
你能提供一个minimal reproducible example吗?您使用的是什么编译器和库版本,在什么 Linux 发行版上?
-
我错了,我想当然地认为
malloc()对齐 8。谢谢。
标签: gcc compiler-optimization sse memory-alignment