C++中返回对象的情形及RVO
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相关推荐
- 浅析 SpringMVC 中返回对象的循环引用问题
问题发现 今天这个话题还是比较轻松的,可能很多朋友也都遇到过这个问题. @RestController.@ResponseBody 等注解是我们在写 Web 应用时打交道最多的注解了,我们经常有这样的 ...
- java使用axis调用.net发布的webservice接口返回对象类型
本人在java中axis-1.4 调用 .net发布的webService接口 有问题欢迎各路大神讨论 !!! 1.1 基本类型 1.2 对象类型 1.3复杂对象类型(对象类中嵌套对象类) 返回基本类 ...
- c++中返回值优化(RVO)和命名返回值优化(NRVO)介绍
RVO和NRVO介绍 前言 半年前就想写一篇关于RVO和NRVO的介绍,但碍于没什么时间去写博客.在跟身边人进行学术探讨的时候,会发现部分人可能尝到了编译器给它做返回值优化的好处,知道这段代码被优化了 ...
- python中id地址什么意思_id()在python中返回的对象地址是什么?
在函数返回时有一个身份的识别,就像我们寄包裹的时候都有一个单号,便于大家随时跟踪它的进度.我们今天要讲的内置函数id()同样可以看作是用来进行身份识别的.那么我们进一步思考,id()最后返回的地址究竟 ...
- java hashcode返回1_java – 为什么hashCode()在所有连续执行中为对象返回相同的值?...
我在 java中尝试一些关于对象相等性的代码.正如我在某处读过的 hashCode() is a number which is generated by applying the hash func ...
- python id()函数(返回对象在内存地址中的唯一标识)
from builtins.py def id(*args, **kwargs): # real signature unknown"""Return the ident ...
- SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法
1.SpringMVC中通过@ResponseBody返回对象,作为JQuery中的ajax返回值 package com.kuman.cartoon.controller; import java. ...
- java内部类外部类_Java内部类:如何在内部类中返回外部类对象
Nasted Class 的介绍,请详见参考 今天讨论的不是不是内部类的概念,而是具体使用的一个场景-如何在内部类中返回外部对象 (孤猪:我在程序里也碰到过一次这样的状况,非静态内部类可以直接调用外部 ...
- .NET 中的对象序列化 (转载)
.NET 中的对象序列化 Piet Obermeyer Microsoft Corporation 2001 年 8 月 摘要:为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便 ...
最新文章
- Yoda 表示法错在哪里
- pygame系列_游戏中的事件
- JavaScript中的闭包
- ora-01591:锁被未分布式事物处理/Distrib tran
- 工作150:1、根据后台传值动态显示开关状态及文字说明(0为文字,1为图标)
- 关于Python的一些学习笔记(小白式笔记,持续更新)
- 下一代软件工程的思考与点滴实践
- 字节跳动研发的云固件投入应用 首批装机200余台X86服务器
- 2个JAVA程序能放在一起吗_求JAVA大神把2程序功能组合在一起
- zabbix3.2通过snmp v2采集Dell服务器iDRAC口信息监控硬件
- 堆、栈、堆栈详谈--复习
- 契税申报期限_纳税申报的5个小常识,会计不知道,真不适合干会计 D1
- WINDOWSXP全面优化
- Lowest Common Ancestor
- [教程] 关于一种比较特别的线段树写法
- 1000000转万 js_javascript将数字转换整数金额大写的方法
- 洗礼灵魂,修炼python(51)--爬虫篇—变色龙般的伪装
- 修改微信文件的默认保存位置
- 使用百度地图实现车辆轨迹回放
- gnuplot 文件_如何使用gnuplot制作eps文件
热门文章
- [转] 设计模式的六大设计原则
- 常见JSP中文乱码例子及其解决方法
- linux rm命令参数及用法详解---linux删除文件或目录命令
- 脚本示例 (Reporting Services)Microsoft Visual Basic .NET
- 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
- asp.net面试的题目
- Codeforces Beta Round #7 C. Line (扩展欧几里德)
- [转]JS调用Android里面的方法,Android调用JS里面的方法
- [转]你不需要jQuery
- 高并发系统数据库设计