C++ Vector 的限制

Limits of C++ Vector

我遇到了 std::vector class 的问题,我创建了一个 struct

struct Triplet{
    int first;
    int second;
    int third;
};

我创建了一个 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();

谁能解释一下为什么要这样做? 我 运行 在 Windows RAM 的 10 和 16Go 上,使用 Qt 和 VSC++ 2017 x86(由于我无法为 x64 编译的 Lemon 库),

一个 std::vector 需要一个连续的(=没有空洞的)内存块来存在。 此外,当将元素推送到向量时,您可能会超出内部容量,这意味着它必须为另一个 std::vector(通常是大小的两倍)分配内存并将元素复制过来。

请记住,在 32 位 Windows 程序中,您只有 2 GB 的可用内存 space 可以在单个进程中使用,无论您的系统有多少内存。您的大小为 60540697 * 12 的向量占用了其中的 700+ MB。根本没地方分配下一个大小(1.4GB)因为内存space太小了

最简单的解决方案是在 64 位模式下编译,它有 大量 的虚拟内存。作为权宜之计,您可以尝试在 std::vector 中预先分配 space 和 T.reserve(80000000) 左右。这将避免中间副本,但可能还不够。如果您的内存 space 碎片化严重,它甚至可能会失败!