C ++でマップに割り当てられたメモリの量/サイズを見つける方法はありますか? マップのサイズ、つまりマップ内のエントリの数を見つける機能がありますが、メモリに対してそのような方法はありますか。マップ(文字列、文字列)があります。sizeof() は常に私に 48 のサイズを与えています。なぜそうなのか? ありがとう :)
6 に答える
簡単な方法はありませんが、本当に知る必要がある場合は (なぜそうする必要があるのでしょうか?)、調べることができます。
すべての標準ライブラリ コンテナは、デフォルトで、「デフォルト アロケータ」を使用して割り当てます。これは、構造体/クラスに 1 対のラッパー関数をnew
配置したdelete
ものにすぎません (これら自体は、内部的にはラッパーに過ぎmalloc
ずfree
、わずかなアライメントと多くのコンパイラで型キャスト)。
何らかの理由で既定のアロケーターに満足できない場合は、コンテナー テンプレートにカスタム アロケーターを提供できます。これにより、そのアロケーターがシームレスに使用されます。
割り当て/割り当て解除で整数をインクリメント/デクリメントするアロケーターを作成すると、動的に割り当てられたメモリの量がわかります。それに加えて の値をsizeof
超精密にします。
いいえ、ありません。.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;
}
マップ クラスのサイズは 48 です。マップのインスタンスはスタックに作成され、挿入するレコードはすべてヒープに格納されます。したがって、map オブジェクトはヒープ内のレコードを指すだけです。疑問は、レコードを挿入した後でも、なぜ 48 であるかのようなものかもしれません。レコードは map オブジェクトと一緒に保存されないため、サイズは一定 - 48 です。ここで回答で述べたように、オブジェクトのサイズは実行時に変化しません。
マップで使用される合計サイズ=
((sizeof(key)+sizeof(value))* map.size())+sizeof(map)
map.size() は、マップ内のレコード数を示します
48 は、マップ インスタンスのサイズです。
実行時にオブジェクトのサイズを変更することはできません。マップの場合、ほとんどの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);