【问题标题】:Limits of C++ VectorC++ 向量的限制
【发布时间】:2020-07-06 12:14:29
【问题描述】:

我遇到了std::vector 类的问题,我创建了一个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 10 和 16Go 的 RAM 上运行,使用 Qt 和 VSC++ 2017 x86(由于我无法为 x64 编译的 Lemon 库),

【问题讨论】:

  • 您应该捕获并打印您的异常以确定发生的哪个错误会破坏您的 while。
  • 这个问题不是一个好的骗子,但这个答案适合:stackoverflow.com/a/3813203/4117728 TL;DR:早在你到达max_size 之前,你的内存就会用完
  • 这能回答你的问题吗? C++ vector max_size();
  • 如果您的 int 是 4 字节并且填充使您的 struct 为 4 个 int,则您有大约 1G 的数据。不知道 32 位 win 的内存布局是什么,但 malloc 的最大块大小可能是 1G。
  • 同样使用reserve规划所需大小,可以提高向量的速度和实际最大容量。

标签: c++ stdvector


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多