C++11中的移动构造函数又把NRV优化翻出来了,都是采用临时中间值优化,两者不能共存。

参数传递如何实现?

【实现模型1】引入临时对象,使用拷贝构造函数初始化。然后利用bitwise copy将其拷贝到x0的位置。比如:
void foo( X x0 );
X xx;
foo( xx );
改写成
X __temp0;
__temp0.X::X ( xx );
foo( __temp0 );还有一件事需要做,修改foo的声明,可以避免bit-wise copy的那一步。
void foo( X& x0 );
也就是生成一个临时对象,然后调用拷贝构造函数用实参初始化这个临时对象。然后往函数里传递这个临时对象的引用。
【实现模型2】直接在程序栈上的活动记录里进行拷贝构造。 
返回值如何实现?
【实现模型1】cfont的实现采用了双阶段转化。1.首先声明一个额外的参数,类型上类对象的引用,用来存放返回结果。2.对这个参数利用返回值进行拷贝初始化。过程类似于参数传递,也是要定义一个临时对象,用来保存返回值,然后在函数内部调用拷贝构造函数用那个return值进行初始化。
X bar()
{
   X xx;
   // process xx ...
   return xx;
}
编译器转化后
// function transformation to reflect
// application of copy constructor
// Pseudo C++ Code
void bar( X& __result )
{
   X xx;
   // compiler generated invocation
   // of default constructor
   xx.X::X();
   // ... process xx
   // compiler generated invocation
   // of copy constructor
   __result.X::X( xx );
   return;
}
 
 
【实现模型2】Named Return Value (NRV) optimization,具名返回值优化,实现这种优化有个前提,就是必须提供copy constructor,因为NRV优化的目的就是为了剔除copy constructor的使用。只有有了才能被剔除,否则谈不上剔除。一般的如果不优化NRV,其实现就是类似于模型1中的过程,而实现了优化的过程则上这样的。
X bar()
{
   X xx;
   // ... process xx
   return xx;
}
__result is substituted for xx by the compiler:
void bar( X &__result )
{
   // default constructor invocation
   // Pseudo C++ Code
   __result.X::X();
   // ... process in __result directly
   return;
}  
是否需要拷贝构造函数呢?
【注意】一方面要考虑默认的语义是否符合我们的需要。另一方面如果对象面临大量的拷贝操作,有必要实现一个拷贝构造函数以支持NRV优化。但是如果想使用底层的memcpy之类的直接进行bit wise copy,注意是否真的是bit wise copy拷贝,比如如果是virtual,这样可能破坏调vptr。
Named Return value 优化:
nrv优化的本质是优化掉拷贝构造函数,去掉它不是生成它。当然了,因为为了优化掉它,前提就是它存在,也就是欲先去之,必先有之,这个也就是nrv优化需要有拷贝构造函数存在的原因。 nrv优化会带来副作用,目前也不是正式标准,倒是那个对象模型上举的应用例子看看比较好。极端情况下,不用它的确造成很大的性能损失,知道这个情况就可以了。  
为什么必须定义了拷贝构造函数才能进行nrv优化?首先它是lippman在inside c++ object mode里说的。那个预先取之,必先有之的说法只是我的思考。查阅资料,实际上这个可能仅仅只是cfont开启NRV优化的一个开关。 
The C++ standard allows the elision of the copy constructor (even if this results in different program behavior), which has a side effect of enabling the compiler to treat both objects as one。也就是我说的副作用,c++标准允许这个副作用的出现,也就是它允许进行NRV优化,但不是必须。 
看下vc++8.0的NRV描述:http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx
(里面说了在vc++ 8.0才加入了NRV优化,NRV优化的开关是有/O后面的级别开启。g++到底有没有,依上面的结果则是没有nrv优化) 
The Visual C++ 8.0 compiler makes use of the flexibility that the standard provides and adds a new feature: Named Return Value Optimization (NRVO). NRVO eliminates the copy constructor and destructor of a stack-based return value. This optimizes out the redundant copy constructor and destructor calls and thus improves overall performance. It is to be noted that this could lead to different behavior between optimized and non-optimized programs (see the Optimization Side Effects section).

参数返回值及NRV优化(named return value optimization)相关推荐

  1. java方法带参数返回值_Java方法中的参数太多,第6部分:方法返回

    java方法带参数返回值 在当前的系列文章中,我正在致力于减少调用Java方法和构造函数所需的参数数量,到目前为止,我一直专注于直接影响参数本身的方法( 自定义类型 , 参数对象 , 构建器模式 , ...

  2. 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))

    学习大数据的第13天--Java面向对象(接口.分析参数返回值的类型不同时如何解决.包以及访问权限修饰符(public.protected.默认.private)) 接口 接口的基本定义: 1.1.语 ...

  3. shell函数参数,返回值

    函数参数 在Shell中,调用函数时可以向其传递参数.在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数- 带参数的函数示例: #!/bin/bashfunW ...

  4. python3 限定方法参数 返回值 变量 类型

    typing模块的作用 自python3.5开始,PEP484为python引入了类型注解(type hints) 类型检查,防止运行时出现参数和返回值类型.变量类型不符合. 作为开发文档附加说明,方 ...

  5. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?

    1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...

  6. python函数调用位置_python函数定义,调用,传参,位置参数及关键字参数,返回值

    使用函数是真正开始编程的第一步,函数y=f(x)我们并不陌生,对x进行一顿操作得到一个值y.给不同的x,进行相同的操作,得到相应的y值. 程序层面函数是执行特定任务的一段代码,将一段代码定义成函数并为 ...

  7. java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)

    Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...

  8. 函数的概念三要素参数返回值好处递归

    函数 概念:实现特定功能的一段代码,可反复使用. 函数的三要素:返回值类型,函数名,形参列表 函数定义:函数的声明和函数的实现 定义语法:public static void main(String[ ...

  9. day03 文件操作 函数 参数 返回值 作用域和名称空间 global和nonlocal

    一.文件 (一)文件操作 open(文件, mode="", encoding="utf-8") 文件读取: r(read) 1. readline() 读取一 ...

最新文章

  1. jQuery EasyUI使用教程之使用标记创建树形菜单
  2. missing 1 required positional argument: 'on_delete'报错解决方案
  3. 电脑开机出现C:\Windows\System32\drivers\fs_rec.sys
  4. python的一些常用操作
  5. 跟JBPM学设计模式之适配器模式
  6. 你需要administrators提供的权限才能删除_终于解决了:你需要来自XXX的权限才能对此文件进行更改
  7. python中使用C类型的数组
  8. FM、LFM、AFM、NFM、DeepFM、 Deep Cross Network
  9. 华为路由器交换机配置命令大整合,非常全,附pdf下载!
  10. 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题?
  11. 才在enom注册了10多个域名,就有人想盗我邮箱
  12. python抓取微博评论破亿_《战狼Ⅱ》破50亿 Python爬虫抓取获取12万条影评分析看它在说...
  13. PS制作五彩抽象人像
  14. 信创操作系统--统信UOS桌面版(使用终端:bash、tty、基本shell操作)
  15. AIX系统的磁带备份
  16. OpenCV4学习笔记(19)——模板匹配
  17. 范式1NF、2NF、3NF和BCNF的区别
  18. java 定时启动window程序、自动滑动鼠标
  19. Model 3 FBCM
  20. 上班拍抖音需谨慎!Tiktok「科技网红」因自拍泄密被苹果解雇

热门文章

  1. 关于“句柄”(Handle)的理解
  2. 如何在线一键装机?在线一键装机win7教程
  3. 用DirctorMx2004自制钟表
  4. linux全局变量区空间多大,从cplb_data全局变量看uclinux的存储空间划分
  5. 认识计算机教案 说课稿,《认识计算机》教案说课稿.doc
  6. php语句翻译软件,poscms多语言系统翻译
  7. 1941年,王洛宾回到兰州的家,有外遇的妻子问他:今晚,你住哪儿
  8. Redis 学习 - 06 漂流瓶案例
  9. CCIR601和CCIR656标准
  10. python散点图animation_如何设置散点图的动画?