8

C ++でマップに割り当てられたメモリの量/サイズを見つける方法はありますか? マップのサイズ、つまりマップ内のエントリの数を見つける機能がありますが、メモリに対してそのような方法はありますか。マップ(文字列、文字列)があります。sizeof() は常に私に 48 のサイズを与えています。なぜそうなのか? ありがとう :)

4

6 に答える 6

5

簡単な方法はありませんが、本当に知る必要がある場合は (なぜそうする必要があるのでしょうか?)、調べることができます。

すべての標準ライブラリ コンテナは、デフォルトで、「デフォルト アロケータ」を使用して割り当てます。これは、構造体/クラスに 1 対のラッパー関数をnew配置したdeleteものにすぎません (これら自体は、内部的にはラッパーに過ぎmallocfree、わずかなアライメントと多くのコンパイラで型キャスト)。

何らかの理由で既定のアロケーターに満足できない場合は、コンテナー テンプレートにカスタム アロケーターを提供できます。これにより、そのアロケーターがシームレスに使用されます。

割り当て/割り当て解除で整数をインクリメント/デクリメントするアロケーターを作成すると、動的に割り当てられたメモリの量がわかります。それに加えて の値をsizeof超精密にします。

于 2012-07-18T09:26:36.423 に答える
4

いいえ、ありません。.sizeただし、文字列や標準コンテナーなどのメソッドをサポートするクラスについては、同様のことを実現できます。

template <class Key, class Value>
unsigned long mapSize(const std::map<Key,Value> &map){
    unsigned long size = sizeof(map);
    for(typename std::map<Key,Value>::const_iterator it = map.begin(); it != map.end(); ++it){
        size += it->first.size();
        size += it->second.size();
    }
    return size;
}

割り当てられたメモリを知りたい場合は、次を使用できます.capacity

template <class Key, class Value>
unsigned long mapCapacity(const std::map<Key,Value> &map){
    unsigned long cap = sizeof(map);
    for(typename std::map<Key,Value>::const_iterator it = map.begin(); it != map.end(); ++it){
        cap += it->first.capacity();
        cap += it->second.capacity();
    }
    return cap;
}
于 2012-07-18T08:26:26.193 に答える
1

マップ クラスのサイズは 48 です。マップのインスタンスはスタックに作成され、挿入するレコードはすべてヒープに格納されます。したがって、map オブジェクトはヒープ内のレコードを指すだけです。疑問は、レコードを挿入した後でも、なぜ 48 であるかのようなものかもしれません。レコードは map オブジェクトと一緒に保存されないため、サイズは一定 - 48 です。ここで回答で述べたように、オブジェクトのサイズは実行時に変化しません。

マップで使用される合計サイズ=

((sizeof(key)+sizeof(value))* map.size())+sizeof(map)

map.size() は、マップ内のレコード数を示します

48 は、マップ インスタンスのサイズです。

于 2015-08-13T09:33:52.570 に答える
0

実行時にオブジェクトのサイズを変更することはできません。マップの場合、ほとんどのstdコンテナと同様に、内部でメモリが動的に割り当てられます。マップが占有および管理する合計サイズを確認するには、次のようにします。

std::map<X,Y> mymap;
int totalSize = sizeof(mymap);
int noElements = 0;

for ( std::map<X,Y>::iterator i = mymap.begin() ; i != mymap.end() ; i++ )
   noElements++;

totalSize += noElements * sizeof(X);
totalSize += noElements * sizeof(Y);
于 2012-07-18T08:25:04.677 に答える