原文 对栈与16
字节对齐的64
位编译中,float8(AVX,32
字节对齐)尤其如此.注意,理论上AVX
也可以在32
位中使用,但目前dmd
既不公开内联
内置函数也不公开YMM0-YMM7
,因此不能在那里遇到这个问题.
据我所知,gcc,icc,llvm
等主要编译器支持对齐正确堆栈对齐>=16
的任何内容.因此,这也应根据C互操作
调查.
公平地说,对于DMD
中栈变量,简单忽略任意对齐
.
不,如果对齐<=
堆栈对齐,这不是真的.
好吧,这很烦人.损坏的代码:
align(16) uint[128] state;
asm { fxsave state; }
//破坏
而,这修复:
uint[128 + 4] buf;
auto state = cast(uint*)((cast(size_t)buf.ptr + 0xF) & ~size_t(0xF));
version (X86_64)
asm { mov RAX, state; fxsave 0[RAX]; }
else
asm { mov EAX, state; fxsave 0[EAX]; }
问题,阻止了这个 在有4字节
栈对齐的Win32
上,以下断言多数都会失败:
void main() {
byte a;
align(8) byte b;
assert((cast(size_t) &b) % 8 == 0);
}