std::unordered_map<int,...>
がほぼ同じサイズのままアイテムを継続的に追加および削除する場合、メモリを連続的に割り当てて解放したり、メモリをキャッシュして再利用しますか(プールやベクターなど)?ライブラリの近代的な標準MS実装を想定しています。unordered_mapを使用した場合のメモリ割り当て
0
A
答えて
0
標準はこれらの側面に固有のものではないため、実装上定義されています。特に、あなたのようなキャッシングの動作は通常カスタムアロケータ(たとえばmemory pool allocator)を使用することで実現されるため、通常はコンテナの実装から切り離す必要があります。
順不同コンテナ約the standard, ~p874の関連ビット:
順不同連想コンテナの要素が バケットに編成されます。同じハッシュコードを持つキーは同じバケットに表示されます。 のバケット数は、要素が の順序付けられていない連想コンテナに追加されると自動的に増加し、バケットあたりの平均数は になります。
と挿入:
インサートとメンバーが イテレータの有効性に影響を及ぼさないもの据え付ける場合(N + N)Nは 内の要素の数である< = Zの*のB、挿入操作の前に、容器は、n個の要素 挿入の数は、Bは、コンテナのバケット数であり、zは、コンテナの 最大負荷率である
行間を読んで、イテレータの有効性には影響しないので、おそらくメモリの割り当ては行われません。これは決して保証されるものではありません(バケットデータ構造がリンクリストである場合は、イテレータを無効化せずに追加することができます)。標準では、要素が削除されたときに何が起こるべきかを指定していないようですが、上記の制約を無効にできないため、メモリを解放する理由は見当たりません。
具体的な実装方法を確認する最も簡単な方法は、ソースコードを読んでコードをプロファイルすることです。 また、rehash
とresize
のメソッドを使用し、マップのload_factorを調整することで、この動作(実際に必要な場合)を制御することもできます。
関連する問題
- 1. 値のタイプがreference_wrapperの場合、値の割り当てがunordered_map
- 2. 変数割り当てを使用したロボットフレームワークの場合
- 3. cudaMallocを使用して割り当てられたメモリは `?? ?? ?
- 4. MapViewOfFileを使用した静的共有メモリの割り当て
- 5. deleteキーワードを使用したメモリの割り当て解除 -
- 6. strtok()関数を使用したときのメモリ割り当て
- 7. メモリがクラスに割り当てられている場合
- 8. callocを使用したメモリ割り当て
- 9. メモリ割り当て
- 10. 割り当てメモリ
- 11. 割り当てメモリ
- 12. メモリ割り当て
- 13. メモリ割り当て
- 14. 割り当てメモリ**
- 15. プラットフォームのInvoke(C#)を使用したアンマネージコードのメモリの割り当てと割り当て解除
- 16. ポインタを使用せずにポインタVSを使用したメモリ割り当て
- 17. Dalvikのメモリ割り当て
- 18. Magentoのメモリ割り当て
- 19. プロセスのメモリ割り当て
- 20. メモリの割り当て(C)
- 21. iphoneのメモリ割り当て
- 22. `getaddrinfo()`のメモリ割り当て
- 23. リンクリストノードのメモリ割り当て
- 24. シャアのメモリ割り当て
- 25. メモリの割り当ては?
- 26. ビデオ用のGPUメモリ割り当て
- 27. cudaで静的に割り当てられたメモリを使用する場合のグローバルデバイスのメモリサイズ制限
- 28. メモリ割り当てプロファイリング中にメモリ割り当てが増加し続ける
- 29. 割り当てられたメモリのビュー
- 30. メモリ割り当て - プロセスツリーの共通メモリ
実装のソースコードを見てください。 –
標準コンテナは、allocatorパラメータを使用してメモリを管理することになっています。彼らはそこで使用されているアルゴリズムを推測して再使用可能なメモリブロックの追加のキャッシュを保持しようとすべきではありません。 –