我在c ++中定义了一个二维向量,它的大小太大了。 voctor定义是这样的:
vector<vector<string> > CommunityNodes(3600, vector<string>(240005));
当我运行程序时,我有以下错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
在运行程序之前,我在控制台行中执行以下命令,指定堆栈大小将是无限的:
ulimit -s unlimited
但我又有了分配错误。我可以在c ++中定义这样的大向量吗?
答案 0 :(得分:3)
假设std::string
的实现包含一个指向其内容的32位指针,一个32位int用于当前字符串长度,一个32位int用于当前分配大小。
这给了我们每个字符串12个字节*每行240005个字符串* 3600行,可以达到9.7千兆字节 - 远远超过32位实现的处理能力。更糟糕的是,一个实现可能很容易将这个12字节的字符串填充到16个字节,从而增加了所需的内存。
如果你去64位实现,你可以寻址更多的内存,但是大小可能会翻倍,所以你需要大约20千兆字节的内存才能存储空字符串数组。添加一些实际内容,你需要更多(并且,再次,字符串可以很容易地填充为更大)。
所以,是的,使用64位实现,这个可能可能会起作用,但对于大多数目的来说它是不切实际的。您可能希望/需要找到一些方法来减少您使用的字符串数量。
答案 1 :(得分:0)
尝试预先分配这么多空间表明您采取了错误的方法解决问题。我怀疑双向量中的大多数节点都是空的。如果是这种情况,那么使用双重映射而不是双向量会更好:
std::map< int, std::map< int, std::string > > CommunityNodes();
然后,您只需创建必须具有的条目,而不是预先分配整个数组。
请注意:使用'[]'运算符会自动创建一个节点,即使您没有为其指定任何内容。如果您不想创建节点,请使用'find()'而不是'[]'。