2

重複の可能性:
C++ では、値渡しと定数参照渡しのどちらが優れていますか?
C++でいつ参照渡しし、いつポインター渡しますか?

私はcとc ++にかなり慣れていません。関数にパラメーターを渡すことに関して次の質問があり、ここで質問して、教祖からの知識の源に直接アクセスするのが最善だと思いました.

パラメータをいつ値渡しする必要があり、いつ参照渡しする必要がありますか? そして、現実の世界で最も一般的に使用されている方法は何ですか?

前もって感謝します。

4

6 に答える 6

3

参照渡しを優先します。通常は次の 1 つ以上です。

  1. 大きいなら。(constこのリストの残りの部分に応じて、とにかくかなり頻繁に実行します)
  2. それを編集して変更をグローバルに表示する場合。
  3. 仮想関数をポリモーフィックに動作させたい場合。
  4. どのタイプになるかわからない場合は、テンプレートコードで。

値渡し:

  1. 自明な組み込み型 (int など) の場合
  2. 変更を加えたくない場合は、元のオブジェクトを変更してください。
  3. const にせずに一時変数を渡すことができるようにしたい場合。
于 2011-05-14T15:02:02.537 に答える
1

パラメータがレジスタよりも大きく、変更していない場合は、const 参照として渡す必要があります。もちろん、後でコピーなどを作成するという例外的なケースもありますが、一般的にはこのルールが当てはまります。

小さい型の場合は、問題ではありません (つまり、const int& または int) は同じ結果を返す必要があります。安全のために、とにかく値で渡します。汎用コードの場合は、Boost Call Traitsライブラリを使用できます。このライブラリは、参照渡しと値渡しのどちらを使用するかを自動的に決定します。

オブジェクトを変更したい場合は、それを参照として渡すと、その場で変更できます。これは通常、新しいオブジェクトを返して元のオブジェクトを上書きするよりも高速です。

于 2011-05-14T15:02:22.313 に答える
0

とりわけ、主にニーズに依存します。渡された変数に加えられた変更が現在の関数に反映されていることを確認したい場合は、確かに参照渡しを使用しますが、渡された変数に変更を加えることが厳密な場合変数が現在の関数に反映されていない場合は、「値渡し」を選択してください。

ありがとう、マウィア

于 2011-05-14T15:09:18.237 に答える
0

一般に、引数を変更する必要があり、呼び出し元にコピーを作成させたくない場合は、値渡しを使用する必要があります。const への参照渡しを使用する必要があります。

ただし、これは実際には「言語のフェデレーションとしての C++」ビットに帰着します。たとえば、STL アルゴリズムを作成している場合は、値渡しを使用する必要があります。これは、反復子とファンクターがポインターと関数ポインターを近似するためです。

于 2011-05-14T15:06:52.603 に答える
0

渡さない理由がない限り、値で渡します。しない理由:

  1. 関数で何らかの方法でオブジェクトを変更する必要があります。参照渡しまたはポインタ渡し。
  2. オブジェクトは「大きい」です。「大きい」の正確な定義は、コンピューター、プラットフォーム、オブジェクトのコピーを作成することによる影響などによって異なります。ケースバイケースで評価する必要があります。const 参照で渡します。
  3. オブジェクトのコピーを作成すると、何か「悪い」ことが起こります。たとえば、ファイル ポインタ オブジェクトをコピーして別のファイルを作成したり、同期オブジェクトをコピーしてデッドロックを作成したりする場合です。const 参照で渡します。
  4. 渡されたオブジェクトにポリモーフィックな動作が必要です。参照渡しまたはポインタ渡し。値を渡すと、オブジェクトがスライスされます。

上記の #2 では、オブジェクトが大きい場合でも値渡しが必要な場合があることに注意してください。値による受け渡しはより単純であるため、保守が容易です。また、値による受け渡しがコード内で実際の問題を引き起こしていると信じる理由がない限り、const 参照による受け渡しは時期尚早のマイクロ最適化である可能性があります。たとえば、関数が 64 バイト (または 64k バイト) のパラメーターを受け取るが、その関数が 1 日に 1 回しか呼び出されない場合、const 参照で渡す理由はまったくありません。それはあなたを実質的に何も節約しません。最初にリリース モードでコードをプロファイリングしてから、最適化します。

于 2011-05-14T15:04:06.590 に答える
0

デフォルトでは、次を除いて const 参照で渡します。

1) in/out または out パラメータが必要な場合 - 関数によって変更されるもの。その場合は、非 const 参照を使用してください。2) 整数、浮動小数点、またはポインターを渡す場合 - 値渡し。

于 2011-05-14T15:05:46.820 に答える