2

クラスに固定タイプのオブジェクトのコンポーネントがあると仮定します。コンポーネントをクラスの属性にする方法は2つあります。1つは、このタイプのabオブジェクトを指すポインターを使用することであり、もう1つは、オブジェクトを直接使用することです。ポインターを使用する場合、コンポーネントの型宣言のヘッダーファイルをインクルードする必要はありませんが、前方宣言のみを使用します。そして、それはより拡張可能です。私の質問はこれです:それにアクセスして使用するときのパフォーマンスはどうですか?最新のコンパイラーは、直接使用と同じまたは同様のパフォーマンスを持つように最適化できますか?それを決めるためのあなたの戦略は何ですか?

愚かな例

// Use pointer.
class A1 { ... };
class A2 { A1* a1; ... };
class A3 { A2* a2; ... };
class A4 { A3* a3; ... };
class A5 { A4* a4; ... };

// Direct use.
class B1 { ... };
class B2 { B1 b1; ... };
class B3 { B2 b2; ... };
class B4 { B3 b3; ... };
class B5 { B4 b4; ... };

より多くのレベルに行く可能性があります。パフォーマンスに大きな違いはありますか?どうもありがとう!

4

3 に答える 3

4

私は通常、デザインを決定する際にパフォーマンスを無視します。はい、もちろん、完全に不合理な方法でデータを保存したくはありませんが、「このオブジェクトにアクセスするのに、X を実行すると、Y を実行する場合よりも 3 クロック サイクル多くかかるのではないか?」と設計で考えるべきではありません。- 「このソフトウェアを正しく動作させ、保守可能にするために何をする必要があるか」について考えるべきです。

コメントで述べたように、参照は別の解決策であり、ポインターで発生する可能性のある「私のポインターがごみを指している」という問題を回避します [ただし、参照がそうでないシナリオを考え出す「創造性」があれば可能です)有効なものに設定せずに参照を作成することはできません]。

パフォーマンス: 間接オブジェクトには、もう 1 つのメモリ読み取りが必要です。したがって、整数などの非常に基本的なものを保存している場合、実際のポインター/参照の内容を読み込んで適切なオブジェクトに到達するために、少なくとも 1 つの余分なメモリが読み込まれます。ただし、1 つの整数だけよりも複雑なオブジェクトの場合は、いずれにせよほとんどの時間がかかるのは他のことです。コンパイラは間違いなく最適化するため、同じ参照/ポインターに対していくつかのことを行う場合、ポインターは1回だけロードされるため、オーバーヘッドは多くのオブジェクトに分散されます。[一度コンパイルすると、参照とポインタはほとんど区別できなくなります]。

誰かが仮想関数のオーバーヘッドについて尋ねたとき (ポインター/参照とほぼ同じオーバーヘッドがあります)、仮想関数と非仮想関数を使用した場合のパフォーマンスを測定するテスト コードを書きました。メモリによると、違いは呼び出しごとに 1 クロック サイクル未満でした。[プロセッサが命令をオーバーラップするため、オーバーヘッドが 1 命令未満になることがあります]。

于 2013-01-29T16:53:08.067 に答える
2

パフォーマンスに注目しましょう:

  1. ポインターは常に間接的であり、2 つの操作が必要です。1 つはアドレスをフェッチし、もう 1 つはアドレスを逆参照して値をフェッチします。
  2. オブジェクト内のオブジェクトは、オフセットのコンパイル時の計算によって処理されます。Asm コードには、オブジェクト全体の先頭から直接 888[eax] スタイルのオフセットがあります。888 はコンパイル時に計算されます。したがって、値にアクセスするのは 1 つの操作だけです。
于 2013-01-29T16:54:28.720 に答える
1

構造共有やその他のカスタム所有権セマンティクスなど、何らかの理由でポインターが必要でない限り、オブジェクトへのポインターの代わりにインスタンスを保存してください。ポインティを明示的に割り当て/割り当て解除する必要がないため、通常は高速になり、プログラムが簡素化されます。

#include(もちろん、明示的なリソース管理を防ぐためにスマート ポインターを使用することもできますが、スマート ポインターは多くのテンプレート コードをドラッグするため、a をスキップするという目的よりも優先されます。)

于 2013-01-29T16:57:01.200 に答える