gpt4 book ai didi

c++ - 用函数返回值初始化一个 std::string,有拷贝吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:35 31 4
gpt4 key购买 nike

我有以下代码,我使用的是 GCC 和 C++11:

std::string system_call(const char *cmd){
std::string a;
...
return a;
}

std::string st = system_call("whatever code");

那里有隐式拷贝吗?我多次调用这个函数,我猜它正在从 system_call 的返回值复制到变量 st,然后释放临时 r-值(value)。

有什么办法可以避免复制?在编译器中使用 st.swap(system_call()) 抛出错误:

error: no matching function for call to 'std::basic_string::swap(std::string)'

我的问题是:

  1. 有没有问题
  2. 如果有的话如何避免

谢谢

编辑:找到了一种使显式交换工作的方法。但是答案是正确的,没有任何好处,因为编译器已经用返回值替换了 st,没有任何拷贝。

system_call("whatever").swap(st);

最佳答案

一般来说,如果 std::string 在调用中构造,然后返回大多数现代编译器应用返回值优化(copy elision 的特例)。如果您想查找精确的规则,您的情况尤其是 Named RVO(感谢@NathanOliver 指出了这一点)。从 C++17 开始,此优化通过标准得到保证。

是否应用了优化很难说,但如果没有应用,那么在 C++11 及更高版本中,范围内的 std::string 对象很可能函数的 将被移动,返回值将被移动到。理论上您可以在返回值上调用 std::move,但这样您也可以防止任何 RVO 发生。虽然 move 可能很有效,但 RVO 通常会产生更快的代码,因为根本没有移动或复制任何东西,但对象是在适当的位置构造的,所以我建议不要这样做,而是支持依赖你的编译器。

关于c++ - 用函数返回值初始化一个 std::string,有拷贝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39750660/

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