std::vector
类有问题,我创建了一个struct
struct Triplet{
int first;
int second;
int third;
};
我创建了一个向量
。 我的问题是它不会包含我所需要的那么多元素,即使t.max_size()=357913941
我使用该函数只得到t.size()=60540697
或t.size()=40360465
vector<Triplet> T;
while(true)
{
Triplet t;
t.first = 1; t.second = 1 ; t.third = 1;
try {
T.push_back(t);
} catch (...) {
break;
}
}
qDebug() << T.size();
有谁能解释一下它为什么要这样做吗? 我运行在Windows 10和16GO的RAM上,使用Qt和VSC++2017x86(由于Lemon库,我无法编译x64),
std::vector
需要一个连续(=没有空穴)的内存块来存在。 此外,当将元素推送到向量时,您可能会超出内部容量,这意味着它必须为另一个std::vector
(通常是两倍的大小)分配内存,并将元素复制过来。
请记住,在32位Windows程序中,无论您的系统有多少内存,您在单个进程中只有2 GB可用内存空间可供使用。 大小为60540697*12的矢量占了其中的700+MB。 根本没有地方分配下一个大小(1.4GB),因为内存空间太小。
最简单的解决方案是在64位模式下编译,这种模式有充足的虚拟内存。 作为一种临时解决方案,您可以尝试用t.reserve(80000000)
左右在std::vector
中预分配空间。 这将避免中间复制,但可能还不够。 如果您的内存空间以一种糟糕的方式被碎片化,它甚至可能失败!