d放松不变
1参考
timon原dip
更新dip
用它来实现通用引用计数
.主要问题是如何引用
计数不变/常量对象
.Timon
最初提议按不影响基于纯优化
方式实现__metadata
.可这样:
应用至相同不变
参数时,强纯
函数(返回无间接
类型)返回相同
结果.
通过重写:
auto a = foo(arg) // foo -> 强纯
auto b = foo(arg)
至:
auto a = foo(arg)
auto b = a
来修复.
可安全转换
从强纯
函数返回的引用集
为不变或共享
.这不受引入__metadata
的影响.
可安全
地省略结果未用
的强纯
函数.
struct S{
private int __metadata x;
}
void foo(immutable ref S s)pure{
s.x += 1;
}
void main(){
immutable S s;
foo(s); // 不必调用它.
assert(s.x==1); // 不能依赖它,可能未调用
}
本质上,如果foo
是强纯,则编译器可优化调用
,并且没了引用计数
.如果这样看,问题似乎无解
.但是,__metadata
的仅供库开发人员
使用,甚至他们也应该格外小心.
因此,建议__metadata
只能从定义它的聚集
内部访问(private
这里是指Java私
),直接访问__metadata
的方法也需要私有
.
因为只有在调用复制构造器和赋值符号
时才会更新引用
.应公开
这些方法,且可调用强制私有
的incRef,decRef
.这样,必须用对象
方法访问__metadata
字段.这是对的,因为只有对象应该管理__metadata
.
现在,如果这样,则除了赋值s
,传递s给函数
或从s复制构造
外,foo
不能访问x
.但是,无论s为何值,一旦结束执行,调用点的引用计数
与调用时相同.为什么?因为在强纯函数
之外无法逃逸s的引用
(除了返回它,但在第1点处理了).
如果有两个后续
的纯函数
调用:foo(args1...)
和bar(args2...)
,仅在不变
和const
数据中重叠(包括通过常
和不变的__mutable
字段访问的数据对象
),从args1
和args2
可传递访问的数据
,这两个调用可安全
地交换顺序(当然,这仅适用于两个函数都不带参数
时)
这不应受影响.
强纯
函数总是可与相邻
不纯函数交换顺序
.
这不应受影响.
你怎么看?我缺少了什么吗?如果你认为这可实现,我可更新DIP
并提交它.
不变和可变
不能混合
.不变,很可能进入只读内存
,在此操作都会导致程序崩溃
.引用计数不变
对象也没有意义.
涉及
到更改const
对象数据
(如引用计数
)时,这是语言底层
工作的低级代码
.即放弃干活所需的一切.
我坚持只读
内存评论.
你仍可运行时
按只读
标记内存,可惜我不知道
在编译器中如何
检测到该点,并因此导致编译失败.
我仍喜欢,对类和结构
的三个新重载符号
方法.
opRefAdd,opRefSub,opReadOnly
.
前两个就像忽略了常
的析构器.
最后1个告诉(不能是const
)类型,进入只读
内存,不可再写.如果实现了引用计数
,这是必需
的.
与__mutable
的主要区别在于它应禁止进入只读
内存:编译器无法检测,但可阻止
这样.这给了非常错误
保证感.
而本方法,显然谁放进只读内存
,及正确编写该类型
,不提供保证,因此无安全感.
我觉得可在解析器
有些快速而廉价
测试,以确定给函数域/@安全
属性.如果做得好,默认可能表明@safe
!
enum __c_bitfield;
is(typeof(value.bitfield) == __c_bitfield)
只要.sizeof
是考虑"空"位和对齐
的实际大小
,这应该相当安全
.它占单个指针,需要特殊反射机制
来取位数+名+类型
元组.
是否将"不变
"数据放入只读
内存中,是在知道类型的内存布局
时决定的.如果有__mutable
字段,就不放入
只读内存.
是的,一切都在@system
代码内.
现有语言规则禁止这样做,因此需要修改
规范.
但是,访问__metadata
应该是@system
.
如,如何在纯析构器
中释放内存?(由我原草案
中的__mutable
函数解决.)
如果析构器
既是纯的又是不变
的呢?
更一般,需要支持自定义
分配不变内存
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现