百科问答小站 logo
百科问答小站 font logo



C/C++中按值传递比按地址传递更快吗, 引用呢? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

写在前面,题主问的是内置类型,那么,基本上就是int char long ptr这类数据,我的回答基于这个大前提来讨论,所以不要再提什么构造函数之类的内容了。

引用和按指针传递,在汇编级别上应该是一样的,所以你的代码里f2和f3在汇编层面上应该是一样的,所以性能上应该没有差别。

至于值传递和引用传递的性能差别,我觉得不应该是写C++代码该关注的地方。


如果真要深入分析这个问题,在不开任何优化的情况下:

mov和lea指令速度是有可能有差异的,现代的x86架构的CPU里,开启流水线不开启HT的情况下,lea可能比mov要快,或者基本上差不多,我查到的信息里:

Ryzen架构下:

MOV r,m的latency是3,throughput是1/2;
LEA r32/64,[m]的latency是2,throughput是1/4;

Haswell架构下:

MOV r32/64,m的latency是2,throughput是1/2;
LEA r32/64,m的latency是1,throughput是1/2;

整体上LEA是要快一些的。

但这里只是考虑到调用者的情况,如果是传引用或者指针,那么意味着被调用函数的内部需要做地址转换,才能获得实际的参数的值。

对于32位系统来说,参数是在栈上的,要先通过ebp获得参数值(指针或者引用),再通过参数值获得实际的指向或者引用的值,要进行两次取地址的操作。

对于64位系统来说,参数是通过寄存器来传递的,仍然需要一次取地址操作才能获得实际的值。

而如果是值传递的话,就没那么复杂了,参数就在栈上甚至在寄存器里,直接用就可以。因此整体来看,如果按值传递,被调用者的开销确实更小。

所以,大致的结论是:对于内置类型来说,值传递确实比指针(和引用)效率要高

以上只是不开优化的结论,开优化以后,性能就不好说了,而且代码的复杂度也会影响优化的效果。

虽然结论是值传递更快,但我仍然觉得如果没有特别的需求,写代码的人不太建议关注它。

-------------------------

更进一步的思考一下:用值传递,那么肯定是不关注这个参数在被调函数内的变化,而用指针或者引用,那么一定是关注这种变化,两种方式的用途是不一样的,效率上有差异是必然的,但多数情况下,不需要人为的去优化,编译器的优化已经足够用了。




  

相关话题

  为何对于无符号数,右移必须是逻辑的? 
  为什么很多程序无法计算负数的立方根? 
  C++在面向对象编程中,非虚继承和非虚析构函数的存在是为了解决什么问题? 能否都用虚继承和虚析构函数? 
  有没有什么程序库使得我们可以比较方便的在windows下使用比较新版本的opengl的? 
  C++为什么要弄出虚表这个东西? 
  如何以最小的改动尽量不改变已有代码的情况下适应不断变更的需求? 
  快奔四的人了,开始学C++,是否太迟了? 
  C语言指针难吗?如何看待数学大v认为指针比范畴论还难? 
  如何理解 C++ 中这两个结构体的大小(size)? 
  C++构造函数为什么要依赖初始化列表? 

前一个讨论
农历的大小月是如何确定的,有没有连续出现几个大月或小月相连的情况?
下一个讨论
找到编译器的bug是种怎样的体验?





© 2025-03-28 - tinynew.org. All Rights Reserved.
© 2025-03-28 - tinynew.org. 保留所有权利