带返回的编译器优化(std :: stringstream ss).str()

时间:2016-02-02 12:48:13

标签: c++ rvo nrvo

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

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

  2. 作为一种做法,这是否可行?

  3. 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);
    

2 个答案:

答案 0 :(得分:1)

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);

您是否会创建一个空字符串,只是为了将其传递给要填充的函数。这意味着你有一个构造和一个赋值,在第一个例子中你可以有一个构造。

答案 1 :(得分:0)

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

  

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