プリミティブ型へのconstの参照を渡すの使用は何ですか?
質問
私は維持するプロジェクトで、私はシンプルget
/ set
法のために、このようなコードの多くを参照してください。
const int & MyClass::getFoo() { return m_foo; }
void MyClass::setFoo(const int & foo) { m_foo = foo; }
の代わりに、次のことをやってのポイントは何ですか?
int MyClass::getFoo() { return m_foo; } // Removed 'const' and '&'
void MyClass::setFoo(const int foo) { m_foo = foo; } // Removed '&'
プリミティブ型への参照を渡すと、右、タイプの値そのものを渡すのと同じ(またはそれ以上)の努力が必要でしょうか?
それは
...結局ただの数です
これはほんの一部未遂マイクロ最適化であるか、本当の利点があるのでしょうか?
解決
の違いは、あなたが参照自分自身にその結果を取得する場合は、機能をリコールせずに、独自の変数名に整数のメンバ変数の変化を追跡することができるということです。
const &int x = myObject.getFoo();
cout<<x<<endl;
//...
cout<<x<<endl;//x might have changed
これはおそらく最良の設計上の選択ではありません、それは場合には、返される範囲から解放されます変数を参照(定数かどうかを)返すために非常に危険です。あなたが参照を返すのであれば、それがスコープ外になる変数ではないことを確認するために気をつけてます。
があり修飾子のための若干の違いがあまりにもですが、もう一度やって価値がある、おそらくない何かまたはそのを意図していた。
void test1(int x)
{
cout<<x<<endl;//prints 1
}
void test2(const int &x)
{
cout<<x<<endl;//prints 1 or something else possibly, another thread could have changed x
}
int main(int argc, char**argv)
{
int x = 1;
test1(x);
//...
test2(x);
return 0;
}
だから、最終的な結果は、パラメータが渡された後も変更を求めることである。
他のヒント
私には、のconst参照を渡すのプリミティブのは間違いです。どちらかあなたが値を変更する必要があり、その場合には、の非const参照を渡すの、またはあなただけの値にアクセスする必要があり、その場合には、あなたが渡すのconstののます。
のConst参照は唯一のコピーオブジェクトがパフォーマンスの問題になることができるとき、複雑なクラスを使用する必要があります。あなたは、変数の値を変更する必要がない限り、プリミティブの場合は、あなたがの参照を渡すべきではありません。の。その理由は、は、のの非参照よりも多くの計算時間がかかるの参照のであるため、プログラムを見つけるために、テーブルにルックアップする必要があります。の参照ということですのアドレスのオブジェクトの。このルックアップ時間がコピー時間よりも短い場合、参照が改善されます。
一般的に、 int型とアドレスの低レベルの実装で同じバイト長を有します。だから、関数の戻り値としてのint型をコピーする時は、ののアドレスをコピーする時間に相当します。しかし、場合には、のint型の返され、何のルックアップが実行されないので、パフォーマンスが向上されます。
の値を戻し、const参照を返すとの主な違いは、その参照をconst_castをし、値を変更することができるということです。
これは悪いデザインと簡単で簡潔なデザインは十分以上になるスマートなデザインを作成しようとする試みの一例です。だけではなく、著者が行う値を返すのコードの読者は、彼が持っていたかもしれないものを意図だと思います。
多くの利点がありません。私は前にgetterとsetterを生成したフレームワークまたはマクロでこれを見てきました。マクロコードは、プリミティブおよび非POD型とセッターのためのボード間だけ使用const type&
を区別しませんでした。私はそれが効率の問題や本物の誤解であることを疑います。チャンスはこれが一貫性の問題である。
私は参照の概念を誤解し、プリミティブデータ型を含むすべてのためにそれを使用している人この種のコードが書かれていると思います。私はまた、このようないくつかのコードを見てきたし、これを行うのいずれかの利点を見ることができません。
タグ以外にはポイントと利点はありません
void MyClass::setFoo(const int foo)
void MyClass::setFoo(const int& foo)
のように、あなたは「setFoo」実装の内側に「foo」で変数を再利用することはできません。そして私は「INT&」はガイだけのconst参照ですべてのものを渡すために慣れると、それと間違っているものがないという理由だけであると信じています。