memory-management - 为什么这个函数返回一个(拥有的)值?

标签 memory-management vala genie ownership-semantics

代码 来自:Genie howto repeat a string N times as an string array Genie 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

有什么区别

返回a.str

返回(拥有)a.str

(拥有)的好处是什么

最佳答案

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 .

关于memory-management - 为什么这个函数返回一个(拥有的)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31386774/

相关文章:

windows - 如何在 Windows 上抑制控制台窗口?

vala - Vala 中的局部静态常量 : possible?

带有位图的 Android 内存不足异常

c - 动态数组在通过引用传递时交换列和行

iOS 模拟器 - 无法为应用程序分配内存

c++ - 我应该删除 vector <string> 吗?

vala - 非阻塞读取 stdin

gtk3 - UI xml 文件中的 Gtk HeaderBar ActionBar pack_start pack_end

lambda - Valas 闭包如何映射到 Genie?

c - 外部声明的 Genie 语法