5

詳細を調べて、古い投稿を渡す方法を決定するための答えを見つけてください(重複して申し訳ありません)

  • 関数が副作用として引数を変更する場合は、非 const 参照で取得します。
  • 関数がその引数を変更せず、引数がプリミティブ型である場合は、値で受け取ります。
  • それ以外の場合は、次の場合を除いて const 参照で取得します
    • とにかく関数が const 参照のコピーを作成する必要がある場合は、それを値で取得します。

【原文は以下です】

値、const 値、参照、const 参照、ポインター、const ポインターによる受け渡しの使用を要約したいと思います。修正して提案をお願いします。

  • 参照とポインタは、できればconstを使ってください(皆様ありがとうございます)。
  • 参照渡しとポインタ渡しの間にパフォーマンスの違いはありません。
  • サイズがポインターよりも大きくない場合 (Mark Ransom のおかげです)、値で渡します。

そしていくつかの質問:

  1. const 値を渡すことはめったにありません。それは有用ですか、それともコンパイラは値渡しで const-ness を検出しますか?
  2. const 参照がスペースを取りすぎています。値渡しのみを使用できますか? 最新のコンパイラは、パフォーマンスを犠牲にしないように最適化しますか?

juanchopanza が言及した「速度が必要ですか? 値渡し」という記事によると、もう 1 つ項目を追加します。

  • 引数をコピーする場合は、それらを値で渡し、const 参照で渡し、関数本体で自分でコピーを行う以外に、コンパイラにコピーを行わせます。

どうもありがとう!

4

1 に答える 1

4

const 値を渡すことはめったにありません。それは有用ですか、それともコンパイラは値渡しで const-ness を検出しますか?

値渡しconstは実際には存在しません。値渡しの場合、変更がサブルーチンの外で見えるような方法で値を変更することはできません。これは、値渡しの場合、元の値のコピーが作成され、そのコピーが関数で使用されるためです。

const 参照がスペースを取りすぎています。値渡しのみを使用できますか? 最新のコンパイラは、パフォーマンスを犠牲にしないように最適化しますか?

( const) 参照による受け渡しは、値による受け渡しと同じではありません。参照渡しの場合、値はコピーされず、メモリ位置が提供されるだけなので、参照渡しの値を (間接的に) 「変更」することができます。

たとえば、次のようにします。

void byValue(int x) {
    x += 1
}
void byRef(int &x) {
    x += 1
}

// ...
{
    y = 10;
    byValue(y);
    cout << y << endl // Prints 10
    byRef(y);
    cout << y << endl; // Prints 11
}
// ...

できるだけ const を使用してください。

必要に応じて渡すconstことは常に良い考えです。これにより、コードが読みやすくなり、メソッドに渡す値がどうなるかを他のユーザーに知らせることができ、メソッド内の値を変更する際に発生する可能性のある間違いをコンパイラーが検出するのに役立ちます。

参照渡しとポインタ渡しの間にパフォーマンスの違いはありません。

あったとしても無視できる量。ここでは、コンパイラが詳細を処理します。ポインターを作成する労力を節約し、適切に逆参照します。

サイズが 1 ワード以下の場合は、値で渡します。

マークが指摘しているように、値がポインターより小さい場合にこれを行います。ポインターは 32 ビット システムと 64 ビット システムでサイズが異なるため (名前の由来)、これは実際にはユーザーの裁量に任されています。私はプリミティブ型 ( charint8_tint16_tfloatなど) を除くほとんどすべてのポインターを渡すのが好きですが、それは私の意見です。

于 2013-01-30T23:07:13.020 に答える