V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zjsxwc
V2EX  ›  程序员

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

  •  
  •   zjsxwc ·
    zjsxwc · 2023-05-03 12:33:41 +08:00 · 1076 次点击
    这是一个创建于 605 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 关键字,手动处理
    zjsxwc
        1
    zjsxwc  
    OP
       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
        2
    codehz  
       2023-05-03 19:55:37 +08:00
    arc 并不是灵丹妙药,而且性能不一定比得上 gc 和手动内存管理,还有额外的空间占用(所有被跟踪的对象,总得有个地方来记录引用计数吧),也没“彻底”解决内存问题(比如手动 weak 可能会炸,但不写可能会漏)
    性能问题举例一个最简单的地方,因为没有额外标注,arc 必然得保证线程安全性,也就是说,即使你只在一个线程中使用,也需要通过线程同步的手段去做,虽然锁的粒度很小,但是由此带来的 happens-before 的语义也会导致很多优化失效
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:49 · PVG 04:49 · LAX 12:49 · JFK 15:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.