【问题标题】:Why this function return an (owned) value?为什么这个函数返回一个(拥有的)值?
【发布时间】:2015-07-13 14:57:30
【问题描述】:

代码 来自:Genie howto repeat a string N times as an string arrayGenie howto repeat a string N times as an string array

def repeatwithsep (e: string, n: int, separator: string): string
    var elen = e.length;
    var slen = separator.length;
    var a = new StringBuilder.sized ((elen * n) + (slen * (n - 1)) + 1);
    for var i = 0 to (n - 1)
        if i != 0
            a.append_len (separator, slen)
        a.append_len (e, elen)
    return (owned) a.str

var a 是一个局部变量,当 a 超出范围时,它会被销毁。 为什么这个函数

返回(拥有)a.str

有什么区别

返回一个.str

返回(拥有)a.str

(拥有的)有什么好处

【问题讨论】:

    标签: memory-management vala genie ownership-semantics


    【解决方案1】:

    return a.str 将使用g_strdup 制作字符串的副本,因为默认情况下,函数结果和 StringBuilder 在(隐式)赋值后都将拥有字符串的单独副本。

    由于存储在 a 中的 StringBuilder 将超出范围,因此它的副本将永远不会被再次使用,在这种情况下这是不可取的/高效的。

    因此解决方案是使用(owned) 指令将字符串的所有权从a.str 传递给函数的结果。

    顺便说一句:您可以通过使用 valac -C 编译两个版本并比较生成的 C 代码来轻松找到这一点:

    -       _tmp21_->str = NULL;
    -       result = _tmp22_;
    +       _tmp23_ = g_strdup (_tmp22_);
    +       result = _tmp23_;
    

    (在此比较中,左侧为return (owned) a.str,右侧为return a.str)

    PS:这在ownership section of the Vala tutorial 和corresponding part of the Genie tutorial 中有记录。

    我也会推荐Reference Handling article。

    【讨论】:

    • 作为那个不解释就写了这个sn-p的混蛋,我可以确认这就是(owned)的原因;)
    • 如果(拥有)?原始数据将完全消失。据我了解,它是unowned。
    • @NaamFamas 我不明白你的评论,你能改写一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多