d加上缺少的置内存
原文
无法工作的代码示例:
extern(C) void main()
{
alias int3 = int[3];
union U { ulong a = 1; uint[3] b; }
//除非类型大小为`1,`否则无法组整个数切片设置为非零值.
{ ushort[] a; a[] = 1; }
{ int[] a; a[] = 1; }
{ ulong[] a; a[] = 1; }
{ float[] a; a[] = 1; }
{ double[] a; a[] = 1; }
{ cdouble[] a; a[] = cdouble.max; }
{ creal[] a; a[] = creal.max; }
{ int3[] a; int3 val = [1, 2, 3]; a[] = val; }
{ U[] a; a[] = U.init; }
//除非类型大小为`1,`否则无法为静态数组的所有成员指定非零初值
{ ushort[4] a = 1; }
{ int[4] a = 1; }
{ ulong[4] a = 1; }
{ float[4] a = 1; }
{ double[4] a = 1; }
{ cdouble[4] a = cdouble.max; }
{ creal[4] a = creal.max; }
{ U[4] a = U.init; }
//如果未显式初化,则具有非零`init`的类型的静态数组也会失败
{ wchar[4] a; }
{ float[4] a; }
{ double[4] a; }
{ real[4] a; }
{ cdouble[4] a; }
{ creal[4] a; }
{ U[4] a; }
//>8字节的标量静态数组甚至不能显式初化为零
{ real[4] a = 0; }
{ cdouble[4] a = 0+0i; }
{ creal[4] a = 0+0i; }
{ U[4] a = U(0); }
//有时甚至单独指定数组的每个元素时也会出现问题
{ int[4] a = [1, 1, 1, 1]; }
{ int[4] a = [1, 2, 3, 4]; }
//有效,因为编译器未试用类似`memset`的方法
{ char[10] a; }
//这些工作
{ wchar[2] a = [0x1234, 0x5678]; a[] = 0; }
//之所以有效,是因为编译器知道,不管类型宽度,可用`memset`清零类型位.
}
这些函数
是在druntime
的rt/memset
中定义的,它没有与betterC
链接.不确定最好方法是什么.可在依赖
它们的每个翻译单元
中发出这些
函数.或,总是内联
代码(尽管一些memset
函数使用内联asm
,dmd
目前不能内联它)
修复
很简单.我写了代码,但没有推它.
只需要成为druntime
中的模板
.假设可让它内联循环,但这会伤害LDC
和GDC
.
arrayOp
实际支持memset
,但是让数组降级使用arrayOp
会使它最终
使用自己.
我也考虑过,在后端使用任意
设置memset
,但是很讨厌.
除了使它为模板外,还需要从e2ir
插入前端的移动调用
,以便实例化
时分析
语义.
长远看,最好是降级
前端代码
,即降低模板勾挂
.
我知道.在dmd
中,应该有另一个仅针对dmd
的语义趟
,因为现有
代码完全是一团糟
.
如,赋值数组
操作,只是数百个行访问器
成员中的一个分支
.
拉兹万
,想法是正确的.嗯,你是对的,但重构
应该在一个单独的公关.
我同意.我唯一保留
意见是LDC
和GDC
似乎可很好地处理-betterC
中的设置
数组,但是如果前端降级,除非开始识别新的模板勾挂
,可能会降低
性能.
另一个(betterC)
中示例,可触发
该情况:
extern(C) void main() {
wchar[2] got;
func(got);
}
void func(out wchar[2] v) {
}
为什么会有这些勾挂
呢?在编译器中,可简单重写为foreach
循环,且完全不依赖
运行时,更不用说rt
中的函数了.
这适合GDC
和LDC
.问题出在dmd
后端.
因为从未工作
,这不是回归
.更多进展.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现