2408d,加@GC作为函数属性
原文
按函数属性添加@gc
概述
按新的用作@nogc
属性的取反
的函数属性
,来添加@gc
.
理由
当对多个函数
应用@nogc
的@nogc:
或@nogc{}
属性语法时,可能在其他属性
中,随后包含
要用(GC)
垃集器分配
的函数,需要如下
:
1,更改
定义函数的位置.
2,关闭大括号声明块
,并在定义
后重新打开它
,使用更多属性
时,会违反DRY
3,用括号
语法更改
冒号语法
,然后应用上述项符号
.
4,消除冒号或块
语法,并附加属性
到,除了新函数的每个函数
定义.
此类更改
会导致更大的差异
,且更难审查
.
前期工作
该提案
精神类似,按throw
属性取反
的按函数属性/存储类
添加不抛
的DIP1029
.
这里
描述
语义
从语义
上讲,@gc
函数恰好是个不是@nogc
的函数.可在语法上附加@nogc
属性的都可附加@gc
属性.
@nogc
{int[] f() => [1]; //错误:`"@nogc"`函数`"f"`中的`数组文本`可能会导致`GC`分配int[] g() @gc => [1]; //好的,`"g"`不是`"@nogc"`
}
@gc
和@nogc
属性与其他对立属性
对如(@safe/@system
和nothrow/throw
)完全相同.
void f() @gc @nogc; //错误:属性冲突
与@system
和throw
一样,@gc
属性是逆变
的.
void f(void function() @gc callback);
void function(void function() @nogc) fp = &f; //好
void g(void function() @nogc callback);void function(void function() @gc callback) gp = &g; //错误.
可用@nogc
方法覆盖虚@gc
方法,但不能用@gc
方法覆盖虚@nogc
方法.
语法
AtAttribute:@ disable@ __future@ nogc
+ @ gc@ liveProperty@ safe@ system@ trustedUserDefinedAttribute