dalign(N)的问题

原文
对栈与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);
}
posted @   zjh6  阅读(22)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示