​原文​​​ 对栈与​​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);
}