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.

posted @   zjh6  阅读(18)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示