gpt4 book ai didi

c++ - 关于 vector 的调整大小和保留的奇怪内存行为

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:09 25 4
gpt4 key购买 nike

我知道 reserve(n) 只分配 n 个空间,但大小为零。

while 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 之前 resize 不改变内存

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
}

reserve 也没有分配内存?为什么?

最佳答案

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

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

随后,当您的程序执行依赖于所分配内存的操作时,操作系统会从硬件内存管理单元捕获不可避免的信号(例如作为页面错误),然后分配页面。这发生在您对 vectorpush_back() 的使用中。

一些操作系统故意这样做,或者可以配置为避免过度分配内存。这种方法的希望是可能会请求大量内存,但程序从未真正使用过。原因是大量分配会影响系统范围的性能(例如,减慢操作系统速度,导致其他程序被换出等)。

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

关于c++ - 关于 vector 的调整大小和保留的奇怪内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55743798/

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