【C++基礎編程】#020 函數傳遞值和傳遞引用&時的區別

函數直接傳遞值(變量)

這種方式傳給形參的是變量的值,傳遞是單向的。如果在執行函數器件形參的值變了,不會回傳給實參。也就是說如果想要實現一個這樣的功能:調用函數後實參的值隨之改變。顯然此方式無法實現。

舉個例子:
執行swap函數後,想要主函數內的變量值變化,用上述方式寫出代碼:

#include <iostream>
using namespace std;
int main()
{
      void swap(int ,int);
      int i =3,j = 5;
      swap(i,j);
      cout<<"i="<<i<<endl<<"j="<<j<<endl;
      getchar();
      return 0;
}

void swap(int a,int b)
{
    int temp;
    temp = a;
    a =b;
    b= temp;
}
運行結果:
i = 3
j = 5

顯然值沒有帶回,i和j的值在執行後沒有發生變化。

函數傳遞引用(利用&)

舉例說明:

#include <iostream>
using namespace std;
int main()
{
      void swap(int & ,int&);
      int i =3,j = 5;
      swap(i,j);
     cout<<"i="<<i<<endl<<"j="<<j<<endl;
      getchar();
      return 0;
}

void swap(int &a,int &b)
{
    int temp;
    temp = a;
    a =b;
    b= temp;
}

運行結果:
i = 5
j = 3

第13行,形參是聲明的引用,注意這個引用並沒有初始化,這就是上面提到的特例。而在第7行調用函數的過程中,實現了引用的初始化,這是傳入的實參就是變量,而不是數值,所以做到了真正意義上的“變量傳遞”。

以上借鑑:
https://blog.csdn.net/chaipp0607/article/details/60151813

兩者區別

除了以上介紹的傳遞參數時的區別,我在刷LeetCode時發現兩者性能也有很大區別。
當要傳遞的參數是string類型時,兩者的運行時長差異很大!
No.126 LeetCode題目 “成語接龍II”爲例,若比較函數寫成:
bool checkDifference(string str1, string str2)則顯示超出時間限制
bool checkDifference(string& str1, string& str2)則通過測試。

在網上查閱一些資料後,發現是如下的原因:

從傳遞效率上來說:這裏所說傳遞效率,是說調用被調函數的代碼將實參傳遞到被調函數體內的過程。對於內建的int char short long float等4字節或以下的數據類型而言,實際上傳遞時也只需要傳遞1-4個字節,而使用指針傳遞時在32位cpu中傳遞的是32位的指針,4個字節,都是一條指令,這種情況下值傳遞和指針傳遞的效率是一樣的,而傳遞double long long等8字節的數據時,在32位cpu中,其傳值效率比傳遞指針要慢,因爲8個字節需要2次取完。而在64位的cpu上,傳值和傳址的效率是一樣的。再說引用傳遞,這個要看編譯器具體實現,引用傳遞最顯然的實現方式是使用指針,這種情況下與指針的效率是一樣的,而有些情況下編譯器是可以優化的,採用直接尋址的方式,這種情況下,效率比傳值調用和傳址調用都要快,與上面說的採用全局變量方式傳遞的效率相當。

在我的64位電腦上,string類型時佔28個字節,因此傳遞參數時用指針會快很多,所以函數要用引用傳遞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章