1

私たちはクラスAを持っていて、Aオブジェクトへのポインタの配列を持っています。その配列の各要素をループすると、各オブジェクトがメモリ内の別の場所にあり、それらが整列していないためにキャッシュミスが発生する可能性がありますそれはオブジェクトへのポインタの配列であり、実際のオブジェクトの配列ではないため、同じブロック内で次々に表示されます。カスタムブロックアロケータを使用してポインタを配列に配置しても問題が解決されない問題を解決しますか?

カスタムアロケータを作成してこれらのオブジェクトを割り当て、ポインタを配列に配置することで、この問題を解決したいと考えています。アロケータは、すべてのオブジェクトがメモリ内で常に隣にあり、ブロック内で整列していることを保証します。それは、配列を反復処理するときに現金を失う問題を解決しますか?

詳細:私は、カスタムアロケータを作成します

、このアロケータは、私は、オブジェクトをALLOCとき、後に、このアロケータは、そのブロック内の空き領域を選択します、すべてのオブジェクトを処理するのに十分な大きさのメモリのブロックをALLOCます毎回、すべてのオブジェクトを別のオブジェクトの隣に置くようにしようとすると、それらは一度にキャッシュメモリにロードされ、キャッシュミスは発生しません。

+0

何ですか?私はあなたの提案された解決策を意味します。 – gsamaras

+0

私はカスタムアロケータを作成します。このアロケータはすべてのオブジェクトを処理するのに十分な大きさのメモリブロックを割り当てます。後でオブジェクトを割り当てると、このアロケータはそのブロック内の空き領域を選択して、別の方法に、彼らはすぐにキャッシュメモリにロードされ、キャッシュミスを少なくする方法 –

答えて

0

最初のポインタから最初のオブジェクトにアクセスすると、ポインタがキャッシュにフェッチされ、次に複数のオブジェクトがフェッチされます。

したがって、2番目のポインタにアクセスすると、すでにキャッシュに格納されているので、2番目のオブジェクトもキャッシュされます。等々。

これは役に立ちますが、ポインターではなく実際のオブジェクトを直接保持するメモリブロックを使用することはできませんか?そうでない場合は、デザインを再評価してください。オブジェクトを直接使用すると、オブジェクトのデータローカリティを最大限に活用できます。

+0

ニース!オブジェクトにはオーバーライドすることができる仮想関数があるので、オブジェクトには異なるサイズ(同じ基本クラス)があります(アロケータはこれを処理できます) –

+0

私は別のものを待っていましたが、まだ、忘れることのないバディを心配しないでください、私は最良の答えを受け入れるでしょう;)、情報の起源への参照を追加することによってそれを改善しようとしてください、そして、 –

関連する問題