d为何不变需要引用计数
原文
是的,读取不存在数据是错误.
不变数据也有生命期.
import std.stdio;
struct S {
int i;
this(int i) {
this.i = i;
writeln(i, "好");
}
~this() {
writeln(i, "坏");
}
}
void main() {
foreach (i; 0 .. 3) {
immutable s = S(i);
}
}
模块级不变和"静态常量"的寿命更长,但也有生命期.然而,今天,不能在不变对象上析构,所以用cast()删除了限定符,应是未定义行为(今天?).
immutable(S) moduleS;
shared static this() {
moduleS = S(42);
}
shared static ~this() {
destroy(cast()moduleS);
}
void main() {
}
同样,认为模块级"不变"和"静态常量"数据符合你说的与程序寿命相同.
符合D的GC数据(包括不变数据).当无引用时,结束生命期.
另一个示例是使用std.concurrency在线程间传递不变消息时:该数据是运行时,只要接收端需要就保持数据活动.
不变与生命期语义无关.
只是说在它生命期中不会修改这片内存.
,真正的问题在常.可变和不变都可自动转变成常.
像immutable/const/shared这样存储类不依赖内存管理策略.也没有规定内存寿命.
它仅指示引用它时如何交互.
引用计数需要"尾常"/"尾不变"的概念,以便限定符的传递性不影响,引用计数的数据(计数字段),而只影响被引用数据.
浙公网安备 33010602011771号