c++中pass by value 和 pass by reference的疑问

ybz_c 2014-04-29 04:43:43
《Effective C++》条款一里说:对内置(也就是C-like)类型而言 pass-by-value通常比pass-by-reference更高效,
这一点很不理解,难道pass-by-reference不是永远比pass-by-value高效吗? 求大神解答
...全文
222 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybz_c 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 TheNewIpad 的回复:
看看汇编就知道了。 内置类型在按值传参时,只是将变量的值传递到栈上。 然后被调用函数将值取出后,使用即可。 在按引用传参时,需要将被引用的变量的地址压栈, 然后被调用函数首先取出地址,然后再次根据地址寻址获取值。 相互比较 1、 按值传参少了一个取值和寻址过程,效率较高 2、 按值传参由于传递的仅仅是实参的值,因此不能在函数内修改实参的值。 有舍有得。 看场景了。 而用户自定义类型相反 按值传参的话,面临的情况较多 1、 POD类型,按值传参时需要在栈上新建一个等大小的区域,然后按位复制。 然后将栈上新变量的首地址压栈。 相比内置类型,多了好多操作。 2、 有复制控制的类型,哪别说了先在栈上开一个临时的空间,用于保存值,然后调用复制构造函数。 然后将首地址压栈。 不过怎么说, 自定义类型按值传参的话,效率低很多。 而自定义类型按引用传参的话,只是将实参的地址压栈即可。 快捷很多。
懂了 谢谢
dbzhang800 2014-04-29
  • 打赏
  • 举报
回复
你可以类比: 值/对象 ==》 网络上一篇帖子的内容 引用 ==》 帖子的网址 当帖子的内容比网址还要短的时候,你觉得直接告诉别人内容简单,还是网址简单?
TheNewIpad 2014-04-29
  • 打赏
  • 举报
回复
看看汇编就知道了。 内置类型在按值传参时,只是将变量的值传递到栈上。 然后被调用函数将值取出后,使用即可。 在按引用传参时,需要将被引用的变量的地址压栈, 然后被调用函数首先取出地址,然后再次根据地址寻址获取值。 相互比较 1、 按值传参少了一个取值和寻址过程,效率较高 2、 按值传参由于传递的仅仅是实参的值,因此不能在函数内修改实参的值。 有舍有得。 看场景了。 而用户自定义类型相反 按值传参的话,面临的情况较多 1、 POD类型,按值传参时需要在栈上新建一个等大小的区域,然后按位复制。 然后将栈上新变量的首地址压栈。 相比内置类型,多了好多操作。 2、 有复制控制的类型,哪别说了先在栈上开一个临时的空间,用于保存值,然后调用复制构造函数。 然后将首地址压栈。 不过怎么说, 自定义类型按值传参的话,效率低很多。 而自定义类型按引用传参的话,只是将实参的地址压栈即可。 快捷很多。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧