8

ここでは2つの質問が1つにまとめられています...

リアルタイムビデオ処理アプリケーションでは、フレームごとに複数回呼び出される関数がいくつかあります。constとpassbyreferenceについてアドバイスすると、関数には次のようなシグネチャがあります。

void processSomething(const int& value);

余分な文字を数文字入力し続けると、これはやり過ぎではないかと思います。

2番目の質問は、QTのスロット/信号メカニズム内での参照渡しのテーマで、通常の関数呼び出しのようにオブジェクトのコピーを防ぐのに役立ちますか?

4

3 に答える 3

19

はい、これはやり過ぎであり、int を値で渡した場合よりも実際にはコードが遅くなります。int は 4 バイトです。参照 (基本的にメモリ アドレス) も 4 バイト (32 ビット マシンの場合) または 8 バイト (64 ビット マシンの場合) です。そのため、実際にはより多くの情報を関数に渡す必要がある場合があります。さらに、その参照を逆参照するオーバーヘッドがあります。

ただし、int より大きいものを渡す場合は、const 参照を使用する方が効率的です。これは、オブジェクト全体をコピーする代わりに 4 バイトまたは 8 バイトだけを渡すことができるためです。

Qtに関する編集:はい、スロットがオブジェクトへのconst参照を取る場合、その理由はオブジェクトをコピーするオーバーヘッドを節約するためです。

于 2009-08-26T08:31:41.807 に答える
7

はい、参照渡しはオブジェクトのコピーを防ぐのに役立ちます。しかし、同じ効果が得られる場合、コンパイラはそれを完全に最適化し、値渡しを挿入することを決定する可能性があります。このような最適化は通常、関数と呼び出しサイトが同じ翻訳単位にある場合に可能ですが、一部のコンパイラはさらにグローバルな最適化を実行できます。必要に応じて、出力されたアセンブリを調べることができます。

これが、パフォーマンスを気にする場合、および本当にその理由がない限り、参照によってプリミティブ型を渡すべきではない理由です。プリミティブ型への const参照の受け渡しの使用は何ですか? を参照してください。その問題の議論のために。

于 2009-08-26T08:31:19.950 に答える
4

まず-の違い

  • void processSomething(const int&value);
  • void processSomething(int value);

通常、const参照はポインタを渡すことによって渡され、もう1つはコピーによって渡されます。(呼び出し側からの)呼び出し後、結果は等しくなります。関数に渡すものは何でも、呼び出しによって変更されません。

関数内でも違いは見られません(少なくともintでは)。オブジェクトでは、もちろんconst関数のみを使用できます。

パフォーマンスの面では、コンパイラと最適化によっては、const参照をintに渡すのが遅くなる場合と遅くなる場合があります。コンパイラーは(理論的には)const参照を値渡しに最適化することができますが、それが行われるかどうかはわかりません。もちろん、値の代わりにintへのポインタを操作するのは遅くなります。

詳細については、「 ポインタを使用する場合と使用しない場合」を参照してください。


他のリンクされた投稿を読んだ後、コンパイラはマルチスレッド環境でそれを最適化することはできません。少なくともMT環境では、const int&とint呼び出しの間に実際の違いがあります。そのリンクの+1。

于 2009-08-26T08:36:15.243 に答える