我知道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
}
保留也没有分配内存吗?为什么?
答案 0 :(得分:7)
这不是由于使用reserve()
或resize()
引起的。这是由您的主机操作系统进行延迟分配引起的。
第一步是operator new()
(由vector
的默认分配器使用)从操作系统请求大量内存。操作系统会向您的程序指示它已完成分配(例如,通过将有效的内存句柄返回到operator new()
,这又将有效的指针返回到您的程序),但实际上并没有分配内存。
随后,当您的程序执行依赖于分配的内存的操作时,操作系统会捕获来自硬件内存管理单元的不可避免的信号(例如,作为页面错误),然后分配页面。这是由于您使用vector
s push_back()
而引起的。
某些操作系统故意这样做或可以将其配置为避免过度分配内存。这种方法的希望是可能会请求大量内存,但程序实际上并未使用它们。原因是较大的分配会影响系统范围的性能(例如,降低操作系统速度,导致其他程序被换出等)。
一个后果是,就您的程序而言,分配可能会成功,但是随后对该分配的内存的使用可能会失败(例如,在使用push_back()
之后调用reserve()
可能会失败)。