d的102版更改-创新互联

原文

创新互联公司-成都网站建设公司,专注成都做网站、成都网站建设、网站营销推广,申请域名,网络空间,成都网站托管有关企业网站制作方案、改版、费用等问题,请联系创新互联公司。更改编译器

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
mimi

3,弃用无效非空增量语句
该最后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成员上调用它.
默认分配器和释放器现在使用Cmalloc并自由分配和释放TraceInfo.现在除了TraceInfo对象自身的分配,几乎都已是nogc了.
好处:
现在可在GC收集例程运行时生成栈跟踪.
InvalidMemoryOperationError现在有栈跟踪.
鲜为人知的是,即使在@nogc函数中,抛Throwable也是在使用GC,但现在(默认)不再是这样.
已修复一些GC挂起.
可能缺点是,在最终析构Throwable时释放TraceInfo,从而导致潜在指针悬挂.如果从Throwable外复制info,请确保不要让它超出可抛(Throwable)的生命期,或确保设置infoDeallocator成员为null.

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:d的102版更改-创新互联
文章起源:http://myzitong.com/article/dghesp.html