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 碎片化严重,它甚至可能会失败!
我遇到了 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 碎片化严重,它甚至可能会失败!