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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现