C++ 传参时传内置类型时用传值(pass by value)方式效率较高
来源:唐磊的个人博客《C++ 传参时传内置类型时用传值(pass
by value)方式效率较高》
在《Effective C++》里提到对内置(C-like)类型在函数传参时pass by value比pass by reference更高效,当用OO的c++自定义类型(存在构造/析构等)pass by reference to const 更好,STL里的迭代器和函数对象是用C指针实现的,因此pass by value更好。至于为什么,下面的代码验证了下。
#include <iostream> using namespace std; int f(int i) { int r = i + 1; return r; } int g(const int & i) { int r = i + 1; return r; } int h(int * p) { int r = * p + 1; return r; } int inter(int * &p) { int r = * p + 1; return r; } int main() { int i = 0x11111111; f(i); g(i); h(&i); int * x = &i; r = inter(x); return 0; }
用VS 2012 默认Debug配置下生成的汇编代码如下:
4: int f(int i) 5: { 00F343D0 push ebp 00F343D1 mov ebp,esp 00F343D3 sub esp,0CCh 00F343D9 push ebx 00F343DA push esi 00F343DB push edi 00F343DC lea edi,[ebp-0CCh] 00F343E2 mov ecx,33h 00F343E7 mov eax,0CCCCCCCCh 00F343EC rep stos dword ptr es:[edi] 6: int r = i + 1; 00F343EE mov eax,dword ptr [i] //直接将i的值取出来给eax 00F343F1 add eax,1 //eax+1 00F343F4 mov dword ptr [r],eax 7: return r; 00F343F7 mov eax,dword ptr [r] 8: } 00F343FA pop edi 00F343FB pop esi 00F343FC pop ebx 00F343FD mov esp,ebp 00F343FF pop ebp 00F34400 ret
后面的几个函数,只截取了关键代码了。
10: int g(const int &i) 11: { ...... 12: int r = i + 1; 00F3449E mov eax,dword ptr [i] // 跟传指针一样,取i的地址到eax 00F344A1 mov ecx,dword ptr [eax] // 将eax的值取出来 放到ecx中 00F344A3 add ecx,1 // ecx值+1 00F344A6 mov dword ptr [r],ecx 13: return r; 00F344A9 mov eax,dword ptr [r] 14: } ......
16: int h(int * p) 17: { ...... 18: int r = *p + 1; 00F3453E mov eax,dword ptr [p] // 取p的地址,让到eax中 00F34541 mov ecx,dword ptr [eax] //把eax的值取出来,让到ecx中 00F34543 add ecx,1 //exc的值+1 00F34546 mov dword ptr [r],ecx 19: return r; 00F34549 mov eax,dword ptr [r] 20: } ......
指针跟上面引用一样。
22: int inter(int * &p) 23: { ...... 24: int r = *p + 1; 01233DBE mov eax,dword ptr [p] //取传进参数(指针)的地址->eax 01233DC1 mov ecx,dword ptr [eax] //取参数指针的地址-->ecx, (是真正值的地址) 01233DC3 mov edx,dword ptr [ecx] //取ecx的内容->edx 01233DC5 add edx,1 //edx 值+1 01233DC8 mov dword ptr [r],edx 25: return r; 01233DCB mov eax,dword ptr [r] 26: } ......
从汇编代码可以看出,为啥内置类型作为函数参数传递时更高效。
C++ 传参时传内置类型时用传值(pass by value)方式效率较高的更多相关文章
- Go语言的传参和传引用[转]
目录[-] 传参和传引用的问题 传slice不是传引用! 什么叫传引用? 为什么传slice不是传引用? 为什么很多人误以为slice是传引用呢? 传指针和传引用是等价的吗? 所有类型的函数参数都是传 ...
- 上有传参下传json的接口调用
1.优化Myrequest import requests from conf.setting import log class MyRequest(): @staticmethod def post ...
- Vue路由传参及传参后刷新导致参数消失处理
项目功能需要,要从列表页跳转到第三方提供的URL上(这里第三方页面我是通过iframe引入在详情页,目的是点击返回时可以通过keepAlive让列表页不刷新,如果不通过iframe直接跳第三方链接,那 ...
- vue传参子传父
vue子传父用$emit实现 1.文件目录结构 2.parent父组件内容 <template> <div class="wrap"> <div> ...
- cocos2dx 菜单按钮回调方法传参 tag传参
.h文件 void menuCallBack(CCObject* pSender); .cpp CCMenuItemSprite* item = CCMenuItemSprite::create( m ...
- vue.js 传参 href传参 与router-link传参
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 1. <a v-bind:href="'#/appinfo/'+cateApp ...
- vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为
vue-router4 出现 No match found for location with path "/" #### router/index.ts文件 import { c ...
- python函数传参是传值还是传引用?
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...
- Postman 串行传参和动态传参详解
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...
随机推荐
- PHP Ajax JavaScript 实现 无刷新附件上传
普通表单 前端页面 后台处理 带有文件的表单 刷新方式 前端界面 后台页面 无刷新方式 大文件上传 POST极值 upload极值 上传细节 前端页面 后台处理 总结 对一个网站而言,有一个基本的不可 ...
- ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明
ROS(indigo) 安装和使用更新版本的Gazebo,本文以7为例. Gazebo7支持更多新的功能,如果使用下面命令安装ROS(indigo): ~$ sudo apt-get install ...
- TortoiseSVN使用
TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,不需要为使用它而付费. TortoiseSVN是 Subversion 的 Windows 扩展.它使你避免接触 Subv ...
- SSH架构实现在线支付功能
在线支付是指卖方与卖方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务,她为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具,在线支付不仅帮助企业实 ...
- Objc中为何某些类的属性要设置为copy而不是strong?
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不知道大家是否注意,我们再使用一些第三方类的时候大多数情况下对 ...
- C++对象模型的那些事儿之三:默认构造函数
前言 继前两篇总结了C++对象模型及其内存布局后,我们继续来探索一下C++对象的默认构造函数.对于C++的初学者来说,有如下两个误解: 任何class如果没有定义default constructor ...
- [java面试]宇信易诚 广州分公司 java笔试题目回忆录
本文地址:http://blog.csdn.net/sushengmiyan/article/details/28479895 作者:sushengmiyan -------------------- ...
- Dynamics CRM2013 去除界面顶部黄色的CRM For Outlook条框
Dynamics CRM2013中每次打开系统页面上方都会有个黄条看着很是烦人,效果如下图 庆幸的是系统提供了关闭的开关,设置-管理-系统设置,把"设置CRM For Outlook消息是否 ...
- Cocos2D:塔防游戏制作之旅(十三)
让我们看一下Waves.plist文件,你将注意到它包含了3个数组.每一个数组表示一波攻击,也就是一组敌人一起到达闹事.第一个数组包含6个字典.每一个字典定义1个敌人. 在本次教程中,字典只存储敌人应 ...
- 【一天一道LeetCode】#87. Scramble String
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...