-2

以下を実行すると、タイトなループで大きなパフォーマンスの違いが見られます。

MyObject foo = bar.GetObject();

MyObject* foo = bar.GetObjectPtr();

クラス関数の詳細は次のとおりです。

class MyClass
{
  MyObject someobject;
  MyObject& GetObject() { return someobject; }
  MyObject* GetObjectPtr() { return &someobject; }
} bar;

最初の行の割り当ては、2 番目の行よりもかなり遅くなります。誰かが何が起こっているのか説明できますか? これは、デフォルトのコピー割り当てと関係がありますか?

4

2 に答える 2

5

具体的には、

  1. 結果のマシンコードでは、ポインターと参照は同じですが、エイリアシングの楽しみが少ないため、コンパイラーが参照を使用してより適切な最適化を実行できる場合があります。
  2. この行が問題であることを示すプロファイリングデータはほぼ確実にありません。実際、その変数はおそらく結果のマシンコードにも存在せず、直接アクセスされます。これは、そのパフォーマンスを判断しようとすることは、関係するすべての人にとって時間の大きな無駄であることを意味します。
  3. マイクロベンチマークコードは、実行時に完全に欠陥があります。最適化されていないコンパイラでも、これら2行で同等の結果が得られます。ベンチマークコードを投稿していた場合は、もっと具体的にすることができます。

投稿されたコードの本当の問題は、提示された大規模なカプセル化違反です。

于 2012-07-13T17:02:39.360 に答える
2

投稿したものが実際にテストしたコードである場合、事実上すべての最新のコンパイラが両方のバリアントに対して同じコードを生成するため、テスト方法に何か問題があるに違いありません (もちろん、いかなる種類のパフォーマンスの違いも生じません)。

他の何かをテストしている場合は、テストに関する詳細を提供する必要があります。

于 2012-07-13T17:06:23.527 に答える