当返回类型不像整型那样简单的复杂对象时,在C++11以前的传统C++,我们倾向以下面的
fun1形式实现,因为fun2 有拷贝代价。
void fun1(std::vector<int> & ret) { // 运算赋值 ret.push_back(1); ret.push_back(2); } std::vector<int> fun2() { std::vector<int> vect; vect.push_back(1); vect.push_back(2); return vect; }
Modern C++ 风格,倾向以fun2的形式,因为默认有RVO(Return Value Optimization, 即返回值优化),避免了拷贝,没有性能损失。并且外界可以使用auto类型推导。
auto vect=fun2();
RVO是编译层的优化,编译碰到返回内部的变量,会把变量声明移外部,这样就不需要拷贝了。有兴趣者,可以跟踪指针在栈中位置证实这点。
若是复杂类型,效果更明显。如C++标准库中,得到时间
auto start1 = std::chrono::system_clock::now();
start其实是很长的类型 std::chrono::time_point<std::chrono::system_clock>
,如果直接去声明,很繁琐。可以视为内部类型。
std::chrono::time_point](http://en.cppreference.com/w/cpp/chrono/time_point)
参考:
[system_clock] https://en.cppreference.com/w/cpp/chrono/system_clock/now