提问者:小点点

C++向量的极限


std::vector类有问题,我创建了一个struct

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

我创建了一个向量; T。 我的问题是它不会包含我所需要的那么多元素,即使t.max_size()=357913941我使用该函数只得到t.size()=60540697t.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),


共1个答案

匿名用户

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

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

最简单的解决方案是在64位模式下编译,这种模式有充足的虚拟内存。 作为一种临时解决方案,您可以尝试用t.reserve(80000000)左右在std::vector中预分配空间。 这将避免中间复制,但可能还不够。 如果您的内存空间以一种糟糕的方式被碎片化,它甚至可能失败!

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|向量|极限)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?