【发布时间】:2019-01-08 20:08:36
【问题描述】:
我有一个程序,我想在其中存储 kmers(大小为 k 的子字符串)和它们出现的次数。对于这个特定的应用程序,我正在读取具有这些值的文件,如果它们出现的次数 > 255,则可以向下舍入到 255。我认为如果我将键值对存储为(字符串, unsigned char) 与将键值对存储为 (string, int) 相比可能会节省空间,但是当我通过运行 /usr/bin/time 检查最大驻留大小时,情况似乎并非如此。
为了确认,我还尝试运行以下测试程序,其中我在 unordered_map 中交替了值的类型:
#include <iostream>
#include <unordered_map>
#include <utility>
#include <string>
#include <fstream>
int main() {
std::unordered_map<std::string, unsigned char> kmap;
std::ifstream infile("kmers_from_reads");
std::string kmer;
int abun;
while(infile >> kmer >> abun) {
unsigned char abundance = (abun > 255) ? 255 : abun;
kmap[kmer] = abundance;
}
std::cout << sizeof(*kmap.begin(0)) << std::endl;
}
这似乎不会影响存储桶中节点的大小(在我的机器上,它对于 unsigned char 和 int 值都返回 40)。
我想知道每个桶中节点的大小是如何确定的。
我对无序映射的理解是,c++ 标准或多或少需要单独的链接,并且桶中的每个节点必须至少有一个指针,以便元素是可迭代的并且可以被擦除(http://bannalia.blogspot.com/2013/10/implementation-of-c-unordered.html)。但是,我不明白存储值的空间量是如何确定的,而且它似乎也必须灵活地容纳更大的值。我还尝试查看 gcc libstc++ unordered_map 标头 (https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/unordered_map.h),但很难理解发生了什么。
【问题讨论】:
标签: c++ unordered-map memory-alignment