2016-07-07 8 views
0

実行中のプログラムで、オブジェクトが割り当てたヒープメモリの量をどのように追跡/印刷できますか?例えばオブジェクトが割り当てたヒープメモリの量を印刷する方法はありますか?

#include <iostream> 
#include <vector> 

int main(){ 

    std::vector<int> v; 

    std::cout << heap_sizeof(v) << '\n'; 

    for (int i = 0; i < 1000; ++i){ 
    v.push_back(0); 
    } 

    std::cout << heap_sizeof(v) << '\n'; 
} 

heap_sizeof()を置き換えることができ、実装はありますか?

+0

通常の場合、特定のプラットフォームのみです。ヒープの実装には非常に結びついています。 –

+0

shared_ptr <はカウントされるべきですか? – lorro

+0

'std :: cout << sizeof(int)* v.capacity()<< endl; – GreatAndPowerfulOz

答えて

1

をすべてにそれが箱の外に設計されていて、いいえ、それは不可能です。あなたは自分でそれを行うためのいくつかのオプションがあります。

これを標準のコンテナ専用に使用する必要がある場合は、そのアロケータによって割り当てられた(そして解放されていない)メモリを追跡するアロケータを実装できます。

new(コンテナかどうかにかかわらず)によって割り当てられたすべてのものに対してこの機能を使用する場合は、グローバルおよび/またはクラス固有の独自の実装をoperator newで提供し、ポインタをブロックサイズにマップして、割り当てられているブロックのサイズを知らせます(そのサイズを取得する関数を用意しなければなりません)。プラットフォームによっては、プラットフォーム固有の機能を使用して実装することもできます。たとえば、Microsoftのコンパイラ(まあ、ライブラリ、実際には)をビルドするときには、operator newの実装は特別なことをする必要はなく、ブロックのサイズを取得する関数は次のようになります。

size_t block_size(void const *block) { 
    return _msize(block); 
} 

さらに別の可能性は、要求された各ブロックの割り当てサイズを、そのサイズを保持するのに十分な大きさの整数だけ大きくすることである。この場合、ユーザーが要求したよりも大きなデータを割り当て、返されたブロックの先頭にそのブロックのサイズを格納します。ユーザーがブロックのサイズを要求すると、渡されたポインターから正しい(負の)オフセットを取り出し、そこで保存した値を返します。

1

最初に、vがヒープ上ではなくスタックに割り当てられます。あなたはstd::vectorオブジェクト自体のサイズをカウントしていない場合(on this articleを見つけ、少し修正)

template <typename T> 
size_t areaof (const vector<T>& x) 
{ 
    return sizeof (vector<T>) + x.capacity() * sizeof (T); 
} 

それによって使用されるスペースの合計量を得るために、私はこの機能を使用することをお勧め、sizeofとの一部を削除します。

template <typename T> 
size_t heap_sizeof (const vector<T>& x) 
{ 
    return x.capacity() * sizeof (T); 
} 
+2

'v'はスタック上にありますが、しかし内容はヒープ上にあります。 – GreatAndPowerfulOz

+0

はい、もちろんです。私は、vがスタック上にあることを指摘したいと思います(彼の例では)。 –

+0

ゴッチャ。明らかにした。 – GreatAndPowerfulOz

0

各オブジェクトの割り当てについて考慮しておらず、特定の時点に割り当てる/解放されたメモリの量をより重視する場合は、malloc統計関数を使用できます。各mallocには独自のバージョンがあります。 Linuxではmallocinfo()を使用できます。

関連する問題