3

代码来自:Genie 如何将字符串作为字符串数组重复 N 次 Genie 如何将字符串作为字符串数组重复 N 次

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

(拥有的)有什么好处

4

1 回答 1

5

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

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

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

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

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

(在这个比较中,左边是return (owned) a.str,右边是return a.str

PS:这在 Vala 教程的所有权部分以及 Genie 教程的相应部分中都有记录

我还推荐参考处理文章

于 2015-07-13T15:17:42.840 回答