std::
コンテナが使用するスペースの量をより正確に測定できるようにするには、割り振る量を記録するカスタムアロケータを提供します。
std::size_t total_allocation = 0;
template< class T >
struct logging_allocator
{
using value_type = T;
using pointer = T*;
using const_pointer = const T*;
using reference = T&;
using const_reference = const T&;
using size_type = std::size_t;
using difference_type = std::ptrdiff_t;
using propagate_on_container_move_assignment = std::true_type;
template< class U > struct rebind { using other = logging_allocator<U>; };
using is_always_equal = std::true_type;
pointer address(reference x) const { return base.address(x); }
const_pointer address(const_reference x) const{ return base.address(x); }
pointer allocate(size_type n, const_pointer hint = nullptr){
total_allocation += n;
return base.allocate(n, hint);
}
pointer allocate(size_type n, const void * hint){
total_allocation += n;
return base.allocate(n, hint);
}
pointer allocate(size_type n){
total_allocation += n;
return base.allocate(n, hint);
}
void deallocate(T* p, size_type n) {
total_allocation -= n;
return base.deallocate(p, n);
}
size_type max_size() const {
return base.max_size();
}
void construct(pointer p, const_reference val) {
total_allocation += sizeof(T);
return base.construct(p, val);
}
template< class U, class... Args >
void construct(U* p, Args&&... args) {
total_allocation += sizeof(U);
return base.construct(p, args...);
}
void destroy(pointer p) {
total_allocation -= sizeof(T);
return base.destroy(p);
}
template< class U >
void destroy(U* p) {
total_allocation -= sizeof(U);
return base.destroy(p);
}
private:
std::allocator<T> base;
}
どのようにしてメモリ消費量を測定しましたか? – Drek
@Drekタスクマネージャからメモリ消費量の詳細を取得しました。私は私のアプリケーションのプロセスIDを使用してそれを見つける。 – Durai
いくつかの*別個のアイテムをいくつ挿入しますか?一度すべての値が挿入されると、 'unordered_multiset'のメモリフットプリントの大きさはどれくらいですか? – dasblinkenlight