- 主题:讨论一下所有权的概念,所有权=析构责 吗?
ownership 其实是一个比喻性的概念,对不熟悉这个名词源流的初学者来说,往往一头雾水。所以想讨论一下,这个东西的核心本质是不是其实就是说 duty of dropping?
我自己目前的结论是,“所有权”主要就是等价于“析构责”,一个变量 own 一个堆资源,其实就是说这个变量需要在他自己出栈销毁的时候负责顺便把那个堆空间也销毁掉(通过 Drop::drop);
其次,所有权还影响可变性。如果一个容器性质的变量 C own 很多成员堆资源,那么如果这个容器 C 是一个 mutable place expr, 那么其内部成员,比如 C[index], C.field, *C (C impl DerefMut<T> 但 C 不是 &mut T)也应该是 mutable place expr。当然这一条并不那么重要。
--
FROM 123.120.189.*
duty of dropping 是一方面吧。
主要还是强调唯一性,类似于unique_ptr的感觉。
【 在 beep 的大作中提到: 】
: ownership 其实是一个比喻性的概念,对不熟悉这个名词源流的初学者来说,往往一头雾水。所以想讨论一下,这个东西的核心本质是不是其实就是说 duty of dropping?
: 我自己目前的结论是,“所有权”主要就是等价于“析构责”,一个变量 own 一个堆资源,其实就是说这个变量需要在他自己出栈销毁的时候负责顺便把那个堆空间也销毁掉(通过 Drop::drop);
: 其次,所有权还影响可变性。如果一个容器性质的变量 C own 很多成员堆资源,那么如果这个容器 C 是一个 mutable place expr, 那么其内部成员,比如 C[index], C.field, *C (C impl DerefMut<T> 但 C 不是 &mut T)也应该是 mutable place expr。当然这一条并不那么重要。
: ...................
--
FROM 58.33.81.*
看标题还以为是法律问题……
【 在 beep (菜M.喵星耗子) 的大作中提到: 】
: ownership 其实是一个比喻性的概念,对不熟悉这个名词源流的初学者来说,往往一头雾水。所以想讨论一下,这个东西的核心本质是不是其实就是说 duty of dropping?
:
: 我自己目前的结论是,“所有权”主要就是等价于“析构责”,一个变量 own 一个堆资源,其实就是说这个变量需要在他自己出栈销毁的时候负责顺便把那个堆空间也销毁掉(通过 Drop::drop);
:
--
FROM 117.136.38.*
具有drop duty的肯定是唯一的呀,防止 double free 呀,唯一性可以说已经包含在 drop duty 里面了
【 在 RunningOn 的大作中提到: 】
: duty of dropping 是一方面吧。
: 主要还是强调唯一性,类似于unique_ptr的感觉。
--
修改:beep FROM 123.120.189.*
FROM 123.120.189.*
我来稍微解释一下:
所有权这个概念,本身在 rust 的语言设计里面是不存在的,是对一些具体的语言设计所造成结果的描述性的概念。也就是说,完全可以设想一个 rust 教程,根本不引入所有权这个词,照样可以把所有的事情讲清楚。
那么,所有权概念,到底对应着语言中的哪些具体设计呢?
1. 局部变量可以通过 box 操作开辟并指向一段堆空间,也就是经常比喻的风筝线;
2. 风筝线变量必有 Drop,出栈销毁前必定收回风筝(堆资源),不会忘记 drop;
3. 风筝线变量必无 Copy,变量交接时原变量失效,即只有一根风筝线,不会重复 drop;
4. 特殊的 Rc/Arc 风筝线变量可以多根线牵同一个风筝,各线 drop 时根据计数决定由谁最后负责收回风筝,保证不会忘记 drop 也不会重复 drop。
感觉这四条是否就可以把所有权概念指代的所有内涵都覆盖到?如果这个理解成立,那么所有权其实就是代表着 duty of drop,并没有其他任何多出来的涵义。
【 在 RunningOn 的大作中提到: 】
: duty of dropping 是一方面吧。
: 主要还是强调唯一性,类似于unique_ptr的感觉。
--
FROM 123.120.189.*
唯一性导致有责去析构,但反之并不成立啊。
析构责为啥要唯一性来保证呢。
【 在 beep 的大作中提到: 】
: 具有drop duty的肯定是唯一的呀,防止 double free 呀,唯一性可以说已经包含在 drop duty 里面了
--
FROM 183.192.17.*
析构责的内在要求就是不能忘记析构(析构的存在性),也不能重复析构(析构的唯一性)。
当然也有例外嘛,Rc 就是通过计数来保证多个东西共享析构责,但保证之后最后存活的那个才会真正执行析构。这也就是共享了所有权
【 在 RunningOn 的大作中提到: 】
: 唯一性导致有责去析构,但反之并不成立啊。
: 析构责为啥要唯一性来保证呢。
--
FROM 123.120.189.*
反对。
对编译器来说,把堆内存绑定给变量,owner难道不是很精炼的名称吗?
owner 和 owned数据类型… 这些都挺精炼的。
然后才造出来ownership ……
写书的时候,给个大标题Ownership,我们拿过来翻译成“所有权”这种大词,再从大到细进行剖解…
然后,经过自媒体和出版社一顿宣传,听得越多,脑子就越乱。最后就变得没法懂了
…
【 在 beep 的大作中提到: 】
:
: 我来稍微解释一下:
:
: 所有权这个概念,本身在 rust 的语言设计里面是不存在的,是对一些具体的语言设计所造成结果的描述性的概念。也就是说,完全可以设想一个 rust 教程,根本不引入所有权这个词,照样可以把所有的事情讲清楚。
:
--
FROM 124.160.154.*
owmership这个概念早在rust出现之前就在面向对象编程语言的分析中有了,总体来说是个偏学术的概念,用来分析对象的控制权,可以通过限制解决内存、并发之类场景的问题。比如学术论文里很早就有ownership type的概念,早期论文是
David G Clarke 1998年的Ownership types for flexible alias protection
【 在 beep 的大作中提到: 】
: ownership 其实是一个比喻性的概念,对不熟悉这个名词源流的初学者来说,往往一头雾水。所以想讨论一下,这个东西的核心本质是不是其实就是说 duty of dropping?
:
: 我自己目前的结论是,“所有权”主要就是等价于“析构责”,一个变量 own 一个堆资源,其实就是说这个变量需要在他自己出栈销毁的时候负责顺便把那个堆空间也销毁掉(通过 Drop::drop);
: ...................
--
FROM 124.64.11.*
以前有个从C魔改的Cyclone语言也试图干这种事,后来并没有落地实用,
也算是Rust内存安全的起源之一了。
【 在 milksea 的大作中提到: 】
: owmership这个概念早在rust出现之前就在面向对象编程语言的分析中有了,总体来说是个偏学术的概念,用来分析对象的控制权,可以通过限制解决内存、并发之类场景的问题。比如学术论文里很早就有ownership type的概念,早期论文是
: David G Clarke 1998年的Ownership types for flexible alias protection
--
FROM 122.225.220.*