C++ 传参时传内置类型时用传值(pass by value)方式效率较高
生活随笔
收集整理的這篇文章主要介紹了
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)方式效率较高的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7打开网络无计算机,Win7电脑系
- 下一篇: Android 10 新增物理按键