2017-09-13 5 views
1

リストのリストがどれくらいのメモリ(バイト単位)を使用しているかを調べようとしています。リストのリストの割り当てられたメモリを追跡するにはどうすればいいですか?

問題はここに例示されている:

enter image description here

それはコンテナリストが他のリスト(ストレージリスト)各保存均一サイズの要素(のは、10バイトずつ言わせて)へのポインタを格納し表示します。最初のストレージリストには4つの要素が格納され、次に30が格納され、次に12と10が格納され、最後に5つの要素が格納されます。すべての要素は同じC++型(単純な古いデータの単なる構造体です)です。

私の目的: コンテナ一覧は、上記の彼が指しているリスト(* PREVおよび*次のポインタのためのすべての追跡スペースで)バイトの数を追跡し、現在のサイズの変数を、持っている必要があります。

これまで、私が試みたのは、静的なクラス変数を使用してリストによって割り当てられたバイト数を追跡​​するために、アロケータを使用しています。リストから要素を移動すると、std :: list :: spliceに問題が発生します。see here:別のコンテナリストに継承された要素は追跡されません。そのバイトを追加するために転送されたバイト数を追跡​​することもできるはずです.Countは別のコンテナリストの現在のサイズにカウントされます。

  • は、私が代わりに そのようにメモリを追跡するために何とかブーストの侵入リストを使用するメモリトラッキングと のためのSTDアロケータの使用を避ける必要がありますか?


  • の問題を解決することで、どのようなC++機能が私をサポートする可能性がありますか?

+1

は私見 'のstd :: allocator'が選択肢です。実装の問題はどこで確認できますか? –

+0

これは[Computer Science](https://cs.stackexchange.com/)に適しています。 – Ron

+1

@ KavehVahedipour私のソリューションのstd :: allocatorの問題は、すべてのコンテナリストで使用されているメモリの合計量を追跡できることにあります。 2つの異なるアロケータを使用してトラッキングされたメモリカウンタを分離する場合、std :: list :: spliceを使用することはできません。これは、同じアロケータを使用する必要があるためです。可能であれば、ポインタは再配置されるだけで転送はバイトを追跡しません(std :: allocatorの割り当ては呼び出されません)。 – Robert

答えて

0

各リストオブジェクトにバインドされているため、EASTLアロケータを使用できることがわかりました。

EASTL :: CustomAllocator :: allocateとEASTL :: CustomAllocator :: deallocateでは、サブリスト(ここではStorage List)の割り当てバイトが変更されたことをメインリストに通知できます(ここではsizeストレージリストによって割り当てられたバイト数で)。

メインリスト(ここではコンテナリスト)は、常に更新された重みを取得し、キャッシュされてメインリストにバインドされます。

に私の答えを参照のメインリストを通知しなければならないCustomAllocatorについては

How to track memory usage using EASTL?

関連する問題