在C++中实现返回计算值的最有效方法是什么?

kfm*_*e04 5 c++ templates rvalue-reference

随着返回值优化之上的右值引用的出现,实现这样的核心函数的最有效方法是什么?我该如何改进这种实现,还是应该不管它?

template <typename T>
string
to_string(const T& t)
{ 
  stringstream ss;
  ss << t;  
  return ss.str();
} 
Run Code Online (Sandbox Code Playgroud)

显然,如果可以的话,我想避免复制或分配内存.TIA.

编辑:Thx到D. Rodriguez的详细答案.现在,我的第二部分是我的问题.有没有办法改善这个?

#define to_cstr( T ) (to_string( T ).c_str())
Run Code Online (Sandbox Code Playgroud)

当然,如果可以的话我想避免使用MACRO,但是如果我复制并粘贴上面的模板代码来返回ss.str().c_str()和const char*,那么临时的活动时间不够长; 虽然代码似乎运行,但valgrind抱怨(红灯).

对于to_cstr(),我无法为上面的MACRO提供更清晰的解决方案.任何想法如何改进,还是我也应该独自离开?

Dav*_*eas 7

只是不管它,它是有效的.即使使用C++ 03编译器,编译器也会优化副本.

基本上编译器将确保调用代码中的对象to_string,return语句to_string和return语句ss.str()都采用完全相同的内存位置.这反过来意味着没有副本.

在标准强制要求之外,函数的return语句的调用约定将通过值返回一个对象,该对象不适合我所知道的所有32/64编译器(包括VS,gcc,intel,suncc)中的寄存器指向函数构造返回对象的内存中的位置的指针,以便代码将在内部转换为以下行中的某些内容:

// Not valid C++! Just for illustration purposes
template <typename T>
to_string( uninitialized<string>* res, const T& t ) {
   stringstream ss;
   ss << t;
   stringstream::str( res, &ss ); // first argument is return location
                                  // second argument is `this`
}
Run Code Online (Sandbox Code Playgroud)