我正在开发一个需要内存效率的程序。我在程序中使用了std::vector
来存储大量元素。但是,我注意到当选择大的元素数时,程序的内存大小呈指数级增长。
例如,我写了以下代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int vecSize;
cin >> vecSize;
vector<double> a(vecSize);
return 0;
}
然后我使用gnu time命令监视内存消耗,如下所示:
/usr/bin/time -f "Mem: %M" a.out
这是我为不同的矢量大小得到的记忆结果:
VecSize MemUsage
10: 4720 KB
100: 4720 KB
1000: 4736 KB
10000: 5024 KB
100000: 7744 KB
1000000: 35872 KB
10000000: 317120 KB
当选择的元素数量超过100000时,是否有人知道为什么内存使用量增长如此之快?
答案 0 :(得分:8)
MSalters是对的,我无法阅读!
答案很简单。对我而言,增长似乎是线性的。
你选择的VecSize呈指数级增长。你应该期望MemUsage也会呈指数级增长! (在大的n限制中 - 可能存在小尺寸优化,小n的近乎恒定的使用证明了......)
我出于好奇心对数据进行了线性回归,相关系数为1.0--表明VecSize和MemUsage(已发布)之间的关系(很可能......不会让我失去统计数据) )线性的。
答案 1 :(得分:4)
运行时增长必须是指数级的,因为push_back
要摊销O(1)。如果你一次增长一个元素,那么增加100.000元素向量将需要100.000个元素副本。
然而,在这种情况下,载体根本不会生长。您只需初始化一个指数级增加的向量。它的大小在所要求的父亲中是线性的。这并不奇怪。
答案 2 :(得分:4)
我无法看到数字呈指数级增长。大小从10 ^ 5到10 ^ 6(10x)增加了大约5倍的内存消耗。从10 ^ 6到10 ^ 7(10x)将内存消耗增加大约10倍。所以它是线性的。
前几个数字(小矢量大小)在这里起作用不大 - 矢量使用的内存可能主要受程序及其运行时的其他需求的支配。一旦你越过那个并且矢量大小开始占主导地位,你就会得到大致线性的缩放,所以一切都很好。