日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 传参时传内置类型时用传值(pass by value)方式效率较高

發布時間:2023/12/14 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)方式效率较高的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。