使用std列表的内存碎片?

时间:2014-11-21 16:20:11

标签: c++ list memory std

我使用列表列表在我的应用程序中存储点数据。

以下是我做的一些测试示例:

//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];

1 个答案:

答案 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