コンピュータはデータをコピーしているのではなく、データのアドレスを指しているだけなので、参照渡しは値渡しよりも高速である必要があると思いました。
ただし、次の C++ コードを検討してください。
#include <iostream>
#include <cassert>
#include <cmath>
using namespace std;
// do not use pass by reference& with this function, it will become so slow
unsigned long long computePascal(const unsigned int row, const unsigned int position) {
if (position == 1 || position == row)
return 1L;
unsigned long long left = computePascal(row-1, position-1);
unsigned long long right = computePascal(row-1, position);
unsigned long long sum = left + right;
return sum;
}
int main() {
int row, position;
cout << "Input row and position: ";
cin >> row >> position;
assert(position > 0 && position <= row);
unsigned long long pascalNumber = computePascal(row, position);
cout << pascalNumber << endl;
return 0;
}
現在、このコードは、三角形の目的の行と位置を入力してパスカル数を再帰的に計算する通常のプログラムです。
行50と位置7を入れてみましたが、約1秒で計算されます(値渡し)。出力は約 1300 万です。これは正しい値です。大量のデータをコピーする必要がないので、代わりに参照渡しをした方が高速になるのではないかと考えました。しかし、これは非常に間違っており、値渡しにかかった時間の約 3 倍の時間がかかった理由がわかりません。質問は ...
const 参照で渡すように変更しようとすると、このプログラムの計算が遅くなるのはなぜですか?
再帰関数は例外であるため、const 参照ではなく値で渡す必要がありますか?