http://www.cnblogs.com/xkfz007/archive/2012/07/21/2602110.html

之前有文章介绍过临时对象和返回值优化RVO方面的问题。见此处。

在C++中,返回对象这一点经常被诟病,因为这个地方的效率比较低,需要进行很多的操作,生成一些临时对象,如果对象比较大的会就会比较耗时。但是在编译器实现的时候,经常是对返回对象的情况进行优化,也就是进行返回值优化 。

在g++中,这个是默认已经进行了优化。以前我希望看看到底C++怎么操作的,但是无法看到,就是因为G++进行了默认的返回值优化RVO。今天在晚上发现可以有一中方法来禁止这个RVO,可以参考这儿。

具体来说就是在编译的时候,加上-fno-elide-constructors这个选项,

#include <iostream>
using namespace std;class HasPtrMem {
public:HasPtrMem(): d(new int(3)) {cout << "Construct: " << ++n_cstr << endl;}HasPtrMem(const HasPtrMem & h): d(new int(*h.d)) {cout << "Copy construct: " << ++n_cptr << endl;}HasPtrMem(HasPtrMem && h): d(h.d) { // 移动构造函数h.d = nullptr;                  // 将临时值的指针成员置空cout << "Move construct: " << ++n_mvtr << endl;}~HasPtrMem() {delete d;cout << "Destruct: " << ++n_dstr << endl;}int * d;static int n_cstr;static int n_dstr;static int n_cptr;static int n_mvtr;
};int HasPtrMem::n_cstr = 0;
int HasPtrMem::n_dstr = 0;
int HasPtrMem::n_cptr = 0;
int HasPtrMem::n_mvtr = 0;HasPtrMem GetTemp() {HasPtrMem h;cout << "Resource from " <<  __func__ << ": " << hex << h.d << endl;return h;
}int main() {HasPtrMem a = GetTemp();cout << "Resource from " <<  __func__ << ": " << hex << a.d << endl;
}

编译执行:

g++ std_move4.cpp -std=c++11$./a.out
Construct: 1
Resource from GetTemp: 0x2572010
Resource from main: 0x2572010
Destruct: 1

添加 -fno-elide-constructors 选项,然后编译执行

$g++ std_move4.cpp -std=c++11 -fno-elide-constructors$./a.out
Construct: 1
Resource from GetTemp: 0x6e7010
Move construct: 1
Destruct: 1
Move construct: 2
Destruct: 2
Resource from main: 0x6e7010
Destruct: 3

可以清晰的看到两次 Move construct 的执行

C++中返回对象的情形及RVO相关推荐

  1. 浅析 SpringMVC 中返回对象的循环引用问题

    问题发现 今天这个话题还是比较轻松的,可能很多朋友也都遇到过这个问题. @RestController.@ResponseBody 等注解是我们在写 Web 应用时打交道最多的注解了,我们经常有这样的 ...

  2. java使用axis调用.net发布的webservice接口返回对象类型

    本人在java中axis-1.4 调用 .net发布的webService接口 有问题欢迎各路大神讨论 !!! 1.1 基本类型 1.2 对象类型 1.3复杂对象类型(对象类中嵌套对象类) 返回基本类 ...

  3. c++中返回值优化(RVO)和命名返回值优化(NRVO)介绍

    RVO和NRVO介绍 前言 半年前就想写一篇关于RVO和NRVO的介绍,但碍于没什么时间去写博客.在跟身边人进行学术探讨的时候,会发现部分人可能尝到了编译器给它做返回值优化的好处,知道这段代码被优化了 ...

  4. python中id地址什么意思_id()在python中返回的对象地址是什么?

    在函数返回时有一个身份的识别,就像我们寄包裹的时候都有一个单号,便于大家随时跟踪它的进度.我们今天要讲的内置函数id()同样可以看作是用来进行身份识别的.那么我们进一步思考,id()最后返回的地址究竟 ...

  5. java hashcode返回1_java – 为什么hashCode()在所有连续执行中为对象返回相同的值?...

    我在 java中尝试一些关于对象相等性的代码.正如我在某处读过的 hashCode() is a number which is generated by applying the hash func ...

  6. python id()函数(返回对象在内存地址中的唯一标识)

    from builtins.py def id(*args, **kwargs): # real signature unknown"""Return the ident ...

  7. SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法

    1.SpringMVC中通过@ResponseBody返回对象,作为JQuery中的ajax返回值 package com.kuman.cartoon.controller; import java. ...

  8. java内部类外部类_Java内部类:如何在内部类中返回外部类对象

    Nasted Class 的介绍,请详见参考 今天讨论的不是不是内部类的概念,而是具体使用的一个场景-如何在内部类中返回外部对象 (孤猪:我在程序里也碰到过一次这样的状况,非静态内部类可以直接调用外部 ...

  9. .NET 中的对象序列化 (转载)

    .NET 中的对象序列化 Piet Obermeyer Microsoft Corporation 2001 年 8 月 摘要:为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便 ...

最新文章

  1. Yoda 表示法错在哪里
  2. pygame系列_游戏中的事件
  3. JavaScript中的闭包
  4. ora-01591:锁被未分布式事物处理/Distrib tran
  5. 工作150:1、根据后台传值动态显示开关状态及文字说明(0为文字,1为图标)
  6. 关于Python的一些学习笔记(小白式笔记,持续更新)
  7. 下一代软件工程的思考与点滴实践
  8. 字节跳动研发的云固件投入应用 首批装机200余台X86服务器
  9. 2个JAVA程序能放在一起吗_求JAVA大神把2程序功能组合在一起
  10. zabbix3.2通过snmp v2采集Dell服务器iDRAC口信息监控硬件
  11. 堆、栈、堆栈详谈--复习
  12. 契税申报期限_纳税申报的5个小常识,会计不知道,真不适合干会计 D1
  13. WINDOWSXP全面优化
  14. Lowest Common Ancestor
  15. [教程] 关于一种比较特别的线段树写法
  16. 1000000转万 js_javascript将数字转换整数金额大写的方法
  17. 洗礼灵魂,修炼python(51)--爬虫篇—变色龙般的伪装
  18. 修改微信文件的默认保存位置
  19. 使用百度地图实现车辆轨迹回放
  20. gnuplot 文件_如何使用gnuplot制作eps文件

热门文章

  1. [转] 设计模式的六大设计原则
  2. 常见JSP中文乱码例子及其解决方法
  3. linux rm命令参数及用法详解---linux删除文件或目录命令
  4. 脚本示例 (Reporting Services)Microsoft Visual Basic .NET
  5. 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
  6. asp.net面试的题目
  7. Codeforces Beta Round #7 C. Line (扩展欧几里德)
  8. [转]JS调用Android里面的方法,Android调用JS里面的方法
  9. [转]你不需要jQuery
  10. 高并发系统数据库设计