2

移動用の新しい命令と新しいメモリ コントローラーを備えた新しい CPU を考慮すると、C++で仮想メンバー関数で構成されるDerivedオブジェクトのベクトルがあるDerived場合、これは局所性にとって良いことですか、悪いことですか?

Base*から 1-2-3 レベル上の派生オブジェクトへの参照を格納する基本クラスへのポインターのベクトルがある場合はどうなるBaseでしょうか。

基本的に動的型付けは両方のケースに適用されますが、キャッシングとメモリアクセスにはどちらが適していますか?

私はこの2つのどちらかを好みますが、この件に関する完全な回答を見たいと思います.

過去 2 ~ 3 年間で、ハードウェア業界から革新的なものと見なす新しいものがありますか?

4

2 に答える 2

1

Derivedベクターではなく保存Base *の方が優れています。これにより、余分な間接レベルが 1 つなくなり、すべてのオブジェクトが連続したメモリに「一緒に」配置されるため、ハードウェア プリフェッチャーの作業が楽になり、ページングや TLB ミスなどに役立ちます。ただし、これを行う場合は、スライスの問題が発生しないように注意してください。

この場合の仮想ディスパッチに関しては、«this» ポインタに必要な調整を除いて、ほとんど問題になりません。たとえば、Derived呼び出している仮想関数をオーバーライドし、既に へのポインターがあるDevied *場合、«this» の調整は必要ありません。それ以外の場合は、基本クラスの «this» 値のいずれかに調整する必要があります (これも継承階層内のクラスのサイズによって異なります)。

ベクトル内のすべてのクラスが同じオーバーロードを持っている限り、CPU は何が起こっているかを予測できます。ただし、異なる実装が混在している場合、CPU は次のオブジェクトごとにどの関数が呼び出されるかを把握できず、パフォーマンスの問題が発生する可能性があります。

また、変更を行う前後に必ずプロファイルを作成することを忘れないでください。

于 2013-08-07T16:40:46.927 に答える