天天看点

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​

​这样​

​存储类​

​不依赖​

​内存管理策略​

​.也没有规定​

​内存寿命​

​.

它仅指示​

​引用​

​它时如何​

​交互​

​.