我使用列表列表在我的应用程序中存储点数据。
以下是我做的一些测试示例:
//using list of lists
list<list<Point>> ls;
for(int i=0;i<10000;++i)
{
list<Point> lp;
lp.resize(4);
lp.pushback(Point(1,2));
ls.push_back(lp);
}
我认为使用的内存将是 10k元素* 5点*点大小= 10000 * 5 * 2 * 4 = 400.000字节+列表容器的一些开销,但程序使用的内存急剧上升。
是由于列表容器的开销还是由于内存碎片造成的?
修改 添加一些信息和另一个例子
Point是mfc CPoint类,或者您可以使用调试模式中的VS2008,Win XP和Window任务管理器使用int x,y,I&m定义您自己的点类来查看应用程序的内存 我不能使用向量而不是外部列表,因为我事先并不知道它的总大小N,所以我必须推送每个新条目。
这里是修改过的例子
int N=10000;
list<vector<CPoint>> ls;
for(int i=0;i<N;++i)
{
vector<CPoint> vp;
vp.resize(5);
vp.reserve(5);
ls.push_back(vp);
}
我将它与
进行比较CPoint* p= new CPoint[N*5];
答案 0 :(得分:2)
它不是&#34; +列表容器的一些开销&#34;。列表开销与对象数量成线性关系,而不是常量。有50,000点,但每个点你也有两个指针(std::list
是双重链接的),并且对于ls
中的每个元素,你有两个指针。另外,每个列表都有一个头尾指针。
所以这是140,002(我认为)额外的指针,你的数学并没有考虑到。请注意,这会使Point
对象本身的大小相形见绌,因为它们非常小。您确定list
是适合您的容器吗? vector
有不断的开销 - 基本上每个容器有三个指针,只有Point
个对象上只有30,003个附加指针。这节省了大量内存 - 如果这是重要的事情。
[基于Bill Lynch的评论更新] vector
可为您的积分分配超过5的空间。 Worst -case,它将分配两倍的空间。但是,由于sizeof(Point)
== sizeof(Point*)
对你来说,因为list
总是使用三倍的空间,所以它仍然严格优于list
。