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这样存储类不依赖内存管理策略.也没有规定内存寿命.
它仅指示引用它时如何交互.

引用计数需要"尾常"/"尾不变"的概念,以便限定符传递性不影响,引用计数数据(计数字段),而只影响被引用数据.

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