参照渡しを使用する方が効率的である場合、パラメータを値渡しとして持つ目的は何ですか? (非プリミティブ データ型の場合。)
また、変更されないように、参照渡しパラメーターに const タグを追加するとどうなるでしょうか?
参照による呼び出しではなく、値による呼び出しを使用することが有益な状況はありますか?
参照渡しを使用する方が効率的である場合、パラメータを値渡しとして持つ目的は何ですか? (非プリミティブ データ型の場合。)
また、変更されないように、参照渡しパラメーターに const タグを追加するとどうなるでしょうか?
参照による呼び出しではなく、値による呼び出しを使用することが有益な状況はありますか?
参照渡しが常に値渡しよりも効率的であるとは限りません。整数への参照ではなく整数を渡すと、通常、1 つの間接化が安くなります。パラメーター リストによっては、一部の値をメモリ内のどこかで間接的に逆参照するのではなく、レジスタに渡すことができます。
効率に関係なく、単に値渡しが必要な場合があります。元のものに影響を与えずに何かを渡し、それを操作/変更できるようにしたい場合は、値渡しがまさに正しいことかもしれません。遅いときは遅い。
実際の例として、priority_queue を扱っているとしますが、状況によっては、その優先度キューの現在の内容を (順番に) ログに書き込みたいとします。プライオリティ キューからの読み取りは破壊的ですが、元のものが無傷である必要があります。明らかな解決策の 1 つ: プライオリティ キューを値でロギング関数に渡します。ログ関数はキューから破壊的な読み取りを行いますが、それが完了すると、周囲のコードには変更されていない元のキューが残っています。
なんらかの理由で関数本体に既にパラメーターのコピーが必要な場合は、通常、そのパラメーターを値で渡す方が効率的です。これは、場合によってはそのコピーがコンパイラによって実際に削除される可能性があるためです。
役立つと思われる抜粋を保存しました(CodingUnitTutorialsから)
参照渡しを使用しない理由として、副作用とプライバシーの 2 つが考えられます。望ましくない副作用は通常、参照パラメーターによる呼び出しに不注意で変更が加えられたために発生します。また、ほとんどの場合、データを非公開にして、関数を呼び出す人が必要な場合にのみ変更できるようにする必要があります。したがって、デフォルトで値による呼び出しを使用し、データの変更が予想される場合にのみ参照による呼び出しを使用することをお勧めします。