ヒープ割り当てとハードウェア キャッシュの動作の関係を調査するためにいくつかのテストを行いました。経験的な結果は啓発的ですが、特に異なるプラットフォームや複雑/不確定なユースケース間では、誤解を招く可能性があります。
私が興味を持っているシナリオは 2 つあります。一括割り当て (カスタム メモリ プールを実装するため) または結果としての割り当て (OS を信頼するため) です。
以下は、C++ での割り当てテストの 2 つの例です。
//Consequent allocations
for(auto i = 1000000000; i > 0; i--)
int *ptr = new int(0);
store_ptr_in_some_container(ptr);
//////////////////////////////////////
//Bulk allocation
int *ptr = new int[1000000000];
distribute_indices_to_owners(ptr, 1000000000);
私の質問は次のとおりです。
読み取り専用操作のためにそれらすべてを反復処理すると、CPU のキャッシュ メモリはどのようにそれ自体を分割する可能性がありますか?
経験的な結果 (一括ソリューションによる目に見えるパフォーマンスの向上) にもかかわらず、他の比較的非常に小さな一括割り当てが以前の割り当てからのキャッシュを上書きするとどうなりますか?
コードの肥大化を回避し、コードの可読性を維持するために、2 つを混在させることは合理的ですか?
std::vector
、std::list
、は、これらの概念のどこstd::map
にstd::set
立っていますか?