gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:50:40 24 4
gpt4 key购买 nike

代码来自: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com