奇怪的内存会重新调整大小并保留关于向量的

时间:2019-04-18 10:09:24

标签: c++ vector stl 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???

我很好奇为什么调整大小直到出现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
}

保留也没有分配内存吗?为什么?

1 个答案:

答案 0 :(得分:7)

这不是由于使用reserve()resize()引起的。这是由您的主机操作系统进行延迟分配引起的。

第一步是operator new()(由vector的默认分配器使用)从操作系统请求大量内存。操作系统会向您的程序指示它已完成分配(例如,通过将有效的内存句柄返回到operator new(),这又将有效的指针返回到您的程序),但实际上并没有分配内存。

随后,当您的程序执行依赖于分配的内存的操作时,操作系统会捕获来自硬件内存管理单元的不可避免的信号(例如,作为页面错误),然后分配页面。这是由于您使用vector s push_back()而引起的。

某些操作系统故意这样做或可以将其配置为避免过度分配内存。这种方法的希望是可能会请求大量内存,但程序实际上并未使用它们。原因是较大的分配会影响系统范围的性能(例如,降低操作系统速度,导致其他程序被换出等)。

一个后果是,就您的程序而言,分配可能会成功,但是随后对该分配的内存的使用可能会失败(例如,在使用push_back()之后调用reserve()可能会失败)。

相关问题