Modern C++程序设计:直接返回数据,而不用输入引用

本文探讨了在C++编程中,如何选择适当的方式返回复杂对象。传统做法是通过引用避免拷贝,如fun1,但现代C++更倾向于使用fun2形式,利用RVO(返回值优化)减少性能损失。RVO是编译器优化的一部分,能避免复杂类型的拷贝。此外,使用auto类型推导简化了代码。对于如时间点等复杂类型,这种优化效果更为显著。
摘要由CSDN通过智能技术生成

当返回类型不像整型那样简单的复杂对象时,在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值