Compiler Optimization with return (std::stringstream ss).str

Compiler Optimization with return (std::stringstream ss).str()

本文关键字:stringstream ss str std Optimization with return Compiler      更新时间:2023-10-16

以下函数接受一个字符串作为参数,并在经过一些处理后返回另一个字符串。

  1. 假设编译器将执行移动优化,并且我最终不会在每次调用后复制字符串的内容是否足够公平?此函数是否应遵循复制省略 [(N)RVO]?

  2. 作为一种做法,这是可取的吗?

std::string foo(std::string const& s)
{ // Perform sanity check on s
  // ...
  std::stringstream ss;
  // do something and store in ss
  // ...
  return ss.str();
}

因为,否则,我通常遵循通过引用返回字符串的做法。所以,可以说,我的函数签名应该是:

void foo (std::string const& inValue, std::string& outValue);

ss.str()将创建一个临时字符串。 如果要将该字符串分配给新实例,例如

std::string bar = foo("something");

复制省略或移动语义将启动。

现在,如果您已经创建了一个字符串,并且您正在将其分配给foo的返回,那么移动分配将开始

std::string bar;
// do stuff
bar  = foo("something");

我更喜欢这种方法,因为它不需要您已经创建了一个对象,其中

void foo (std::string const& inValue, std::string& outValue);

会让你创建一个空字符串只是为了将其传递给函数进行填充。 这意味着你有一个构造和一个作业,在第一个示例中,你可以有一个构造。

根据这一点,当您返回值时,它会更加优化:

返回值优化 (RVO) 允许编译器通过让调用方和被调用方对两个"副本"使用相同的内存块来优化副本。