百科问答小站 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位系统来说,参数是通过寄存器来传递的,仍然需要一次取地址操作才能获得实际的值。

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

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

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

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

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

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




  

相关话题

  为什么总是有人说 Java 啰嗦,却没人说 C++ 啰嗦? 
  大公司为什么无法轻松使用更新的c++版本? 
  既然有指针了,为什么c++还搞个引用出来? 
  为什么很多新型编程语言都抛弃了 C 语言风格的 for 语句? 
  只会c语言语法,就能强行做一个编译器出来吗? 
  写库函数供他人用的原理是什么? 
  一个程序员多年累计编写一百万行代码是什么体验? 
  链表求交集,从链表头删去一长串而非一个节点?(已解决)? 
  如何理解 Golang 中“不要通过共享内存来通信,而应该通过通信来共享内存”? 
  快奔四的人了,开始学C++,是否太迟了? 

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





© 2024-09-28 - tinynew.org. All Rights Reserved.
© 2024-09-28 - tinynew.org. 保留所有权利