d的dip1000,2
@safe
存在根本性设计
缺陷,而DIP1000
用来解决它.这不仅是为了新模型
,而是要修复
现有模型漏洞
.如下在无DIP
时编译,但DIP1000
可检测到:
@safe ref int oops1()
{ int[5] arr;
int[] slice = arr[];
return slice[2];
}
@safe ref int oops2()
{ struct AnInt
{ int here;
int* myAddress()
{ auto result = &here;
return result;
}
}
AnInt myInt;
return *myInt.myAddress;
}
如果反对DIP1000
,你必须:
1,应该放弃@safe
从程序
中消除未定义行为
.我讨厌它.
2,假设简单禁止切片静态数组
,并在@safe
代码中,从成员函数引用
结构成员地址
.这会破坏
很多代码,并迫使@safe
代码放弃相当多性能.我也讨厌.
3,想出更好的检查
方法.我不能.
我想提下,处理栈中
数据时,只需要域
.一般在堆上
分配东西更实用
,这样就不必与检查域
作斗争.
仅传递
给域
参数的变量,可在栈
上,而不是堆
上分配,
void f(scope T);
T v = new T; // 可在栈上分配.
f(v);
是的,但在栈上
分配是优化
.因此,对@safe
代码,只需让编译器
管理所有内存
,并在需要优化内存
的地方添加提示
.然后让编译器
决定并报告布局
是什么及为什么.
最后,域
允许在@nogc
函数中使用new
.并且支持优化分配
,因此域
不仅适合静态分析器
这不是有效
优化,因为DIP1000
无法跟踪间接.因此,我可在子图中有与v
相互连接的对象
.
可优化时,LDC
已经可以做到.DIP1000
在这里没用.