怎么看 GTK 的 Vala 语言使用“自动引用计数”代替 “垃圾回收”

2023-05-03 12:33:41 +08:00
 zjsxwc
https://wiki.gnome.org/Projects/Vala/ReferenceHandling

Vala 语言使用“自动引用计数”代替 “垃圾回收”,

为了解决“循环引用”于是引入了关键字:
“weak” :弱引用
“owned” :转移所有权,老变量变弱引用,新变量变唯一强引用
“unowned” :目前与“weak”效果一样

所以缺点是:虽然没有了悬空野指针,但如果程序员失误,没用 weak 处理潜在的循环引用,仍旧会内存膨胀。


特殊情况时:
1.对于外部 so 库的数据(即不是 Vala 语言内部提供的会“自动引用计数”类型)类型
2.通过[Compact]注解的类型也会失去“自动引用计数”特性的类型
对于这两种特殊情况的处理方式可以:

- 方法 1. Copy 成 Vala 语言内部提供的会“自动引用计数”类型后处理(提供 copy method 注解来自动处理)
- 方法 2. 使用 <类型>* 星号 与 delete 关键字,手动处理
950 次点击
所在节点    程序员
2 条回复
zjsxwc
2023-05-03 12:54:43 +08:00
苹果的 Swift 也居然是一样的设计,ARC “自动引用计数”,解决“循环引用”的途径也是 weak 与 unowned

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/automaticreferencecounting/#Resolving-Strong-Reference-Cycles-Between-Class-Instances

Swift 里 unowned 与 weak 的区别只是:
<短生命周期的对象> 里的某个属性 可以 unowned 一个 <长生命周期的对象>,但回过来想<短生命周期的对象>必然早于<长生命周期的对象>销毁,所以和 weak 没区别,但语义上程序员就得有义务在代码上手动地随时保证被 unowned 标记的属性不会为 nil 。
codehz
2023-05-03 19:55:37 +08:00
arc 并不是灵丹妙药,而且性能不一定比得上 gc 和手动内存管理,还有额外的空间占用(所有被跟踪的对象,总得有个地方来记录引用计数吧),也没“彻底”解决内存问题(比如手动 weak 可能会炸,但不写可能会漏)
性能问题举例一个最简单的地方,因为没有额外标注,arc 必然得保证线程安全性,也就是说,即使你只在一个线程中使用,也需要通过线程同步的手段去做,虽然锁的粒度很小,但是由此带来的 happens-before 的语义也会导致很多优化失效

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/936988

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX