由引用传参与指针传参调试引出的关于lea,add,inc在流水线,分支预测上的优越性比较

背景

昨天才发现按引用传参是C++的功能,C语言没有按引用,略微有点在意,顺便调试一下,发现了一些感觉值得记录的,有一点疑问的地方

正文

先声明一下,我之前并没有过一步步调试引用传参的经历,在我之前的淳朴想法当中,按指针传参和引用传参是一样的,对那个地址的内容解引用就可以了

不过这种淳朴的想法效率其实太低了,测试源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
int a = 10;
int* p=&a;
int foo(int a){
a++;
return a;
}
int baar(int &a){
a++;
return a;
}
int ham(int *a){
(*a)++;
return *a;
}
int main(){
int c;
c = foo(a);
c = baar(a);
c = ham(&a);
return 0;
}

编译指令如下

1
gcc -m32 -g -o refer main.cpp

实际情况为了把数据操作尽可能留在CPU寄存器内部

实际操作居然是用地址操作符LEA完成的

1
2
3
4
5
6
0x565561d8 <baar(int&)+17>    mov    eax, dword ptr [ebp + 8]
0x565561db <baar(int&)+20> mov eax, dword ptr [eax]
0x565561dd <baar(int&)+22> lea edx, [eax + 1] //这里的eax储存的内容不是地址,而是普通的数据,这里只是利用lea做加法
0x565561e0 <baar(int&)+25> mov eax, dword ptr [ebp + 8]
0x565561e3 <baar(int&)+28> mov dword ptr [eax], edx
0x565561e5 <baar(int&)+30> mov eax, dword ptr [ebp + 8]

关于加法的优化,涉及流水线和分支预测的优化

文章如下

https://stackoverflow.com/questions/12163610/why-inc-and-add-1-have-different-performances

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2019-2024 kier Val
  • Visitors: | Views: