我有两个无序映射:(代码在linux中执行)

第一张无序 map :

它由更多至少65536个条目组成。每个条目包括

int
unsigned char
unsigned char

第二个无序 map :

它由少于65536个输入组成。每个条目包括
int
int
int
vector <char>

现在,我想根据以上两个无序映射(以字节为单位)占用的内存进行比较。之后,我要计算实现的内存压缩。
请指导我如何找到两个无序映射所占用的内存?

第二张无序 map 的更多详细信息:
typedef std::tuple<int, int> key_t;

struct KeyHasher
{
  std::size_t operator()(const key_t& k) const
  {
      using boost::hash_value;
      using boost::hash_combine;

      // Start with a hash value of 0    .
      std::size_t seed = 0;

      // Modify 'seed' by XORing and bit-shifting in
      // one member of 'Key' after the other:
      hash_combine(seed,hash_value(std::get<0>(k)));
      hash_combine(seed,hash_value(std::get<1>(k)));

      // Return the result.
      return seed;
  }
};

struct Ndata
{
int value;
vector<char> accept ;
};

typedef boost::unordered_map<const key_t,Ndata,KeyHasher> SecondMap;
}

最佳答案

我认为,如果不查看STL使用的确切unordered_map实现,就不可能精确地回答您的问题。

但是,根据 unordered_map interface,您可以进行有根据的猜测:
unordered_map需要存储:

  • 一个bucket容器(可能是类似 vector 的结构)
  • max_bucket_count存储桶(可能是类似单链列表的结构)
  • 每个项目一个完整的条目(不仅是值,还有键,用于处理键哈希冲突)

  • 快速浏览Libc++实现后,您还需要存储空间:
  • 哈希函数对象
  • 相等性测试函数对象
  • 分配器函数对象

  • 考虑到这一点,我的猜测将是这样的:
    typedef unordered_map<K, V, ...> tMyMap;
    
    size_t getMemoryUsage(const tMyMap& map) {
      auto entrySize = sizeof(K) + sizeof(V) + sizeof(void*);
      auto bucketSize = sizeof(void*);
      auto adminSize = 3 * sizeof(void*) + sizeof(size_t);
    
      auto totalSize = adminSize + map.size() * entrySize + map.max_bucket_count() * bucketSize();
      return totalSize;
    }
    

    这仅适用于您的第一种情况,因为在第二种情况下,根据每个 vector 的大小,每个条目的内存使用情况可能完全不同。对于第二种情况,因此您必须添加以下内容:
    size_t getMemoryUsage(const tMyMap& map) {
      auto entrySize = sizeof(K) + sizeof(V) + sizeof(void*);
      auto bucketSize = sizeof(void*);
      auto adminSize = 3 * sizeof(void*) + sizeof(size_t);
      auto totalSize = adminSize + map.size() * entrySize + map.max_bucket_count() * bucketSize();
    
      auto contentSize = 0;
      for (const auto& kv : map) {
        // since accept is a vector<char>,
        // it uses capacity() bytes of additional memory
        contentSize += kv.second.accept.capacity();
      }
      totalSize += contentSize;
    
      return totalSize;
    }
    

    但是,考虑到现实世界中的分配逻辑,您的 map 实际使用的内存可能由于以下原因而与此相差很大:外部碎片。如果要100%确定unordered_map使用多少内存,则还需要考虑分配器行为。

    关于c++ - 计算无序映射占用的内存空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22498768/

    10-11 18:47