gpt4 book ai didi

通过构造函数为 vector 预分配 C++ 内存失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:01 25 4
gpt4 key购买 nike

我使用的是 VS2013 (Win7 64)。我发现了一些奇怪的行为。当我使用 reserve 方法保留内存时,代码有效,但是当我通过构造函数保留时,它会抛出 bad_alloc

const int elemNumber = 100000000;
try
{
//std::vector<int>* intVector = new std::vector<int>(elemNumber); // throws bad_alloc
std::vector<int>* intVector = new std::vector<int>();
intVector->reserve(elemNumber); //OK

std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();

for (int i = 0; i < elemNumber; ++i)
{
intVector->push_back(i);
}

end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << "Time interval: " << elapsed_seconds.count() << endl;
delete intVector;
cout << "Done" << endl;
}
catch (bad_alloc exc)
{
cout << exc.what() << endl;
}

可能是什么原因?

最佳答案

hlt 已经在评论中回答了这个问题......

The constructor doesn't reserve, it resizes. Is it possible you just run out of memory?

...所以将解释发布为社区 wiki...

这...

std::vector<int>* intVector = new std::vector<int>(elemNumber); // throws bad_alloc

...需要用默认构造的元素填充 vector ,因此它正在写入 elemNumber int 所需的所有内存页面,以及初始 size()elemNumber,而...

std::vector<int>* intVector = new std::vector<int>();
intVector->reserve(elemNumber); //OK

...只是为内存保留虚拟地址——在稍后添加元素之前,操作系统不需要找到实际的后备内存;初始的 size() 仍然是 0

程序然后转到 push_back 很多元素 - 对于第一种情况,它们是除了已经在 vector 中的那些默认构造的元素,这就是内存不足的原因。

还请记住,在调整大小期间暂时使用的内存(由 push_back 超出 capacity 引起)随着容器变大而增加,容器趋向于增加的数量也会增加填充容量,这样它就不必太快再次调整大小,并且所需的任何内存在虚拟地址空间中必须是连续的(这对于 32 位应用程序来说主要是一个潜在的问题)。

关于通过构造函数为 vector 预分配 C++ 内存失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31585343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com