我在std::vector课堂上遇到了问题,我创建了一个struct
struct Triplet{
int first;
int second;
int third;
};
Run Code Online (Sandbox Code Playgroud)
我创建了一个vector<Triplet> T. 我的问题是它不会包含我需要的元素,即使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();
Run Code Online (Sandbox Code Playgroud)
谁能解释一下为什么要这样做?我在 Windows 10 和 16Go 的 RAM 上运行,使用 Qt 和 VSC++ 2017 x86(由于我无法为 x64 编译的 Lemon 库),
一个std::vector需要的连续(=无孔)的存储器块中存在。此外,推动元件为矢量时,你可以过冲内部容量,这意味着它有分配内存为另一个std::vector(通常是尺寸加倍)并且复制元件超过。
请记住,在 32 位 Windows 程序中,无论您的系统有多少内存,在单个进程中都只有 2 GB 的可用内存空间可供使用。您大小为 60540697 * 12 的向量占用了其中的 700+ MB。由于内存空间太小,根本没有地方分配下一个大小(1.4GB)。
最简单的解决方案是在具有大量虚拟内存的64 位模式下编译。作为权宜之计,您可以尝试在std::vectorwithT.reserve(80000000)左右预分配空间。这将避免中间副本,但可能还不够。如果您的内存空间以糟糕的方式碎片化,它甚至可能会失败!