18

実際の環境では、gcc または MS Visual Studio を使用して、同じサイズまたは int より小さい値の型を const 参照で渡すのは悪いことですか?

つまり、そのような関数を書くのは悪いことですか:

void f(const bool& b);

また

void f(const char& c);

それよりも:

void f(bool b);

また

void f(char c);

私が尋ねている理由は、これらの場合に参照を渡すことの利点が見当たらないためですが、何かが欠けている可能性があります。

4

6 に答える 6

23

少し悪い場合もあれば、まったく効果がない場合もあります(元の値が格納されている場所、オプティマイザーの品質、コードの処理方法によって異なります)。

この標準では、リファレンスの実装方法は義務付けられていませんが、実際には、コンパイラはポインタを使用してリファレンスを実装します。したがって、一般的なケースでは、bool&aは、を使用して実装さbool*れます。これは、にアクセスするには、bool毎回追加のポインター逆参照が必要であることを意味します。aboolはポインタよりも大きくないため、この欠点を相殺するためのメモリフットプリントの削減やバイトコピーの削減はありません。

結果として、受け入れられている方法は、より効率的であるため、プリミティブを値として渡すことです。もちろん、参照などを渡すことは実際には何も爆破しませんが、ループ内の値にアクセスしない限り、おそらく測定可能な違いは生じません。

于 2012-08-13T10:38:59.073 に答える
13

パフォーマンスはさておき、実際には異なる動作が発生する場合があります。

たとえば、const参照を渡すと、関数が参照先の変数の値を変更できないようになりますが、別のスレッドが変更する可能性があります。参照渡しの場合 ( を使用してもconst)、これらの変更が表示されますが、値渡しの場合は表示されません。

また、インターフェイスの定義によって、関数内の変数で実行できることが制限されます。次の例を検討してください。

int foo(int a) {
    a = 5; // valid
}

int bar(const int& a) {
    a = 5; // compiler-error
}

参照によって渡し、ローカルで使用するために変数の値を変更する場合は、追加のコピーを作成する必要があります。値渡しの場合は、すでにコピーがあります。

于 2012-08-13T10:46:15.937 に答える
2

理由の1つは、値が一定であることを他のプログラマーに伝えたいということです。場合によっては、const boolそれで十分ですが、より明確になる可能性があります。

于 2012-08-13T10:40:36.320 に答える
1

by value実質的に高速なconst referenceので、組み込み型を渡す方が良いと思います。参照を渡す場合は、参照を作成して(つまり、アドレスを取得して)、変数を使用するときに逆参照する必要があります。ほとんどの場合、いずれの場合もコンパイラによって最適化されますが

于 2012-08-13T10:38:48.923 に答える
0

それは本当に重要ではありません。値を渡すとコードがよりクリーンになり、したがって良い習慣と見なされます。

于 2012-08-13T10:38:40.200 に答える
0

理論的には良い考えではありませんが、参照は通常ポインターを使用して実装されるためです。しかし、それにもかかわらず、すべての合理的なコンパイラは、基本型のby-const-referenceとby-valueの間のセマンティクスの無関心を認識するのに十分賢いはずです。

複雑なタイプと基本的なタイプで機能する必要のあるある種のテンプレート化されたインターフェイスがあり、過度の特殊化のオーバーヘッドが必要ない場合は、多くの場合、選択の余地がありません(最も単純な例:) std::vector。ただし、選択肢がある場合は、基本型を値で渡すことをお勧めします。

于 2012-08-13T10:42:27.923 に答える