Mr.*_*Guo 1 c++ stl vector eigen
我知道reserve(n)仅分配n个空间,但大小为零。
而resize(n)分配n个空间,大小为n。
但是当我在测试中通过窗口任务管理器观察到内存变化时,我对结果感到困惑。
我的代码已经占用了100MB,然后逐步测试以下代码:
vector<Eigen::Vector4f> vec;
vec.resize(5000000); //memory still take 100MB???
vec.push_back(Eigen::Vector4f::Zero()); //memory take 181MB???
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么调整大小直到有push_back才改变内存
vector<Eigen::Vector4f> vec;
vec.reserve(5000000); //memory still take 100MB???
for(int i = 0 ; i < 5000000; i++){
vec.push_back(Eigen::Vector4f::Zero()); // memory increase one by one from 100MB to 181MB
}
Run Code Online (Sandbox Code Playgroud)
预留也没有分配内存?为什么?
不是由reserve()或引起的resize()。这是由您的主机操作系统执行延迟分配引起的。
第一步是operator new()(由vectors的默认分配器使用)从OS请求大量内存。操作系统会向您的程序指示它已完成分配(例如,通过将有效的内存句柄返回到operator new(),从而又返回了指向您程序的有效指针),但实际上并未分配内存。
随后,当您的程序执行依赖于分配的内存的操作时,OS会从硬件内存管理单元捕获不可避免的信号(例如,作为页面错误),然后分配页面。这是在您使用vectors时发生的push_back()。
某些操作系统有意这样做或可以将其配置为避免过度分配内存。这种方法的希望是可能会请求大量内存,但程序实际上并未使用它们。原因是较大的分配会影响系统范围的性能(例如,降低操作系统速度,导致其他程序被换出等)。
一个结果是,就您的程序而言,分配可能会成功,但是后来对该分配的内存的使用可能会失败(例如,调用push_back()后reserve()可能会失败)。