原文

1,已弃用遗漏冲突的extern (D) @system函数定义同一模块中多个函数的定义,在DMD 2.095.0后已算错误.
但是,尽管有同样混杂,两个实现显式的和推导的@系统属性有区别时,编译器不发出错误.
void foo() {}
void foo() @system {} //无错误现在已修复.如果有冲突@系统实现,现在发出弃用警告.
从DMD2.112开始,与其他模块内函数类型冲突一样,产生多个定义错误.
2,在重载集上弃用调用__traits(getAttributes)
在此版本之前,__traits(getAttributes)可在单个函数和重载集上同时调用.但是后者,编译器只为第一个词法定义的函数收集.此行为易错.考虑:
module test;
@("gigi")
void fun() {}
@("mimi")
void fun(int) {}
void main()
{static foreach(attr; __traits(getAttributes, fun))
pragma(msg, attr);尽管未指示实际查询重载,上面代码打印"gigi".总是选择第一个重载.
从本版开始,弃用__traits(getAttributes)的该用法.如果要处理指定重载,可结合使用__traits(getOverloads)和__traits(getAttributes):
@("gigi")
void fun() {}
@("mimi")
void fun(int) {}
void main()
{static foreach (t; __traits(getOverloads, test, "fun"))
static foreach(attr; __traits(getAttributes, t))
pragma(msg, attr);
//打印
gigi
mimi3,弃用无效非空增量语句
该最后for语句不应产生值.现在检测并显示弃用消息.以下for语句都会触发弃用:
// 无副作用的计算"j"
int j;
for (;; j) {...}
// 不必要的解引用
for (ubyte* sp;; *sp++) {...}
// 第一个句子是块语句
// 最后句子是函数字面,而不是块语句
for({j = 2; int d = 3;} j + d< 7; {j++; d++;}) {...}注意:调用返回空的函数,即使函数闲着,也不弃用.这是模板代码.
4,现在可在栈上分配赋值给域数组变量的数组字面.
以前,它们总是与垃集一起分配,因此在@nogc中或更好C代码不可用.导致频繁使用以下方法:
void main() @nogc
{int[3] buffer = [10, 20, 30];
int[] arr = buffer[];
}现在可用一行来写:
void main() @nogc
{scope int[] arr = [10, 20, 30];
}具有以下限制:
1,必须显式注解变量域,而不仅是推导域
2,必须传递-preview=dip1000,以避免在旧代码中引入内存破坏.
3,注意,在@系统及@信任代码中,编译器不会验证域变量是否逃逸.
4,数组字面必须初化变量.随后数组字面赋值仍然使用GC.
5,数组元素不能有析构器
其中一些限制可能会在未来取消.
5,静断现在支持多个消息参数条件计算结果为假时,后续式都转换为串然后连接.生成的串诊断与错误一起打印出来.
enum e = 3;
static assert(false, "a = ", e);打印:
`file.d(2)`:错误:静断:`a=3`6,添加-preview=systemVariables
自接受DIP1035系统变量以来,@safe代码无法再访问标记为@system的变量.为了避免代码中断,编译器从发出弃用警告开始.预览开关会转换为错误,且在未来版本默认启用.
@system int* p;
struct S
{@system int i;
}
void main() @safe
{int x = *p; // 有开关,算失败,否则,发出弃用
S s;
s.i = 0; // 同上.
}注意,目前仅限显式标记为@system的变量,尚未实现基于变量初化器的推导@system.
生成Throwable.TraceInfo,默认值现在是@nogc的.工作方式:运行时现在有2个跟踪相关函数,一个分配,另一个来释放跟踪信息.两者都通过相同的Runtime.traceHandler函数来设置的.设置释放函数的第二个参数是可选的(因此不会影响现有代码).
抛Throwable时,如果尚未设置跟踪信息,运行时用指定函数来分配跟踪信息.如果释放函数为非空,则复制函数指针到可抛(Throwable)对象中,并复制到infoDeallocator新成员中.析构可抛(Throwable)时,如果设置了infoDeallocator成员,则会在info成员上调用它.
默认分配器和释放器现在使用C的malloc并自由分配和释放TraceInfo.现在除了TraceInfo对象自身的分配,几乎都已是nogc了.
好处:
现在可在GC收集例程中运行时生成栈跟踪.InvalidMemoryOperationError现在有栈跟踪.
鲜为人知的是,即使在@nogc函数中,抛Throwable也是在使用GC,但现在(默认)不再是这样.
已修复一些GC挂起.
可能缺点是,在最终析构Throwable时释放TraceInfo,从而导致潜在指针悬挂.如果从Throwable外复制info,请确保不要让它超出可抛(Throwable)的生命期,或确保设置infoDeallocator成员为null.
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页题目:d的102版更改-创新互联
URL链接:http://www.jxjierui.cn/article/dghesp.html


咨询
建站咨询
