原文
创新互联公司-成都网站建设公司,专注成都做网站、成都网站建设、网站营销推广,申请域名,网络空间,成都网站托管有关企业网站制作方案、改版、费用等问题,请联系创新互联公司。更改编译器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
成员上调用它.
默认分配器和释放器
现在使用C
的malloc
并自由分配和释放TraceInfo
.现在除了TraceInfo
对象自身的分配
,几乎
都已是nogc
了.
好处:
现在可在GC
收集例程
中运行
时生成栈跟踪
.InvalidMemoryOperationError
现在有栈跟踪
.
鲜为人知的是,即使在@nogc
函数中,抛Throwable
也是在使用GC
,但现在(默认)不再是这样.
已修复一些GC
挂起.
可能缺点是,在最终析构Throwable
时释放TraceInfo
,从而导致
潜在指针悬挂
.如果从Throwable
外复制info
,请确保不要让它超出可抛(Throwable)
的生命期,或确保设置infoDeallocator
成员为null
.
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧