我正在尝试制作大量随机数来进行算法分析。然后我遇到了这个我无法解释的问题。请考虑以下代码:
#include <exception>
#include <iostream>
#include <deque>
typedef unsigned long long mytype;
const mytype SIZE = 150000000;
int main()
{
std::deque<mytype> rand;
try
{
for (mytype i = 0; i< SIZE; i++)
{
rand.push_back(1); //Just push a dummy number into the deque
}
}
catch (std::exception& e)
{
{
std::cout << e.what() << std::endl;
}
}
return 0;
}
这将导致错误的分配异常。 问题是如果我使用vector和reserve()它会工作。纠正我,如果我没有做到这一点,是不是deque那种容量更大的数据结构,因为它没有像vector那样连续分配内存?
我在Win8 x64,visual studio 2012,带有8G RAM的intel i7上运行。感谢您分享您的想法
答案 0 :(得分:2)
问题是由内存碎片引起的。
如果直接使用vector.reserve,则会在开始时获得大块内存。应用程序启动时内存碎片很少,因此当时分配大量内存的机会很高。
当你在循环中使用deque.push_back时,deque将首先保留一小块内存(例如大小为A字节),当循环运行时,deque达到其内存限制,然后它将分配2 * A字节,然后将数据复制到新内存;然后是4 * A字节,然后是8 * A字节....我很久以前就读过deque的代码了,所以细节可能有问题,这里的想法是这个循环会导致很多内存分配/释放这将导致高内存碎片,如果内存碎片很高,分配大量内存的机会很低。
有关内存碎片的详细信息,请参阅this。