如何减少unordered_multiset的内存消耗?

时间:2017-08-04 09:42:01

标签: c++ performance c++11 stl unordered-multiset

我在代码中使用了unordered_multiset,原因如下:

  1. 应该很容易找到或查找数据。
  2. 应支持加载重复值。
  3. unordered_multiset通常比multysets& vector,用于插入和查找,有时甚至用于删除。

    但不好的是,它需要太多的记忆。

    我在unordered_multiset中存储了无符号__int64(8字节)值,并正确清除了unordered_multiset中的值。 你有没有人可以解释一下,为什么要记住它?如何解决这种内存消耗?

2 个答案:

答案 0 :(得分:0)

通过为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; } 容器使用的空间量。

e.g。

{{1}}

答案 1 :(得分:0)

Caleth有一个很好的建议,或者你可以查看memory usage within processes

在插入multiset之前和之后。

很可能是差异的过程,加载了一个巨大的dll。