是在连续空间中分配的嵌套向量

时间:2013-11-07 17:45:21

标签: c++ performance memory vector stl

例如,以下代码创建1000000向量,每个向量的长度为10。

之后我们可以顺序扫描矢量几次。如果在连续空间中分配第二层向量(可能很少有第二层向量可以适合高速缓存块),则以下访问是有效的。但是,如果第二层向量分配在不同的地方,每次我们离开内部循环时,我们可能会跳转到一个随机位置来获取数据,这是无效的。

vector<vector<int > > a(1000000 , vector<int>(10))

for (int i = 0; i < a.size(); i++)
{
     for (int j = 0; j< a[i].size() ; j++) {
         a[i][j]++;
     }
}

此外,如果首先在连续空间中分配第二层矢量。在我们将元素推送到向量之后,由于缺少空间来将它们原位扩展,它们可能会被移动到其他空间。他们还会留在附近吗?

谢谢。

EDIT1

谢谢,是否有任何实现将它们组合在一起以提高顺序扫描的性能?

2 个答案:

答案 0 :(得分:3)

vector<int>只是一个小型控制器类,通常长三个字。实际管理的动态内存是动态分配的,因此它基本上是随机位置。您的外部向量管理连续范围的内部向量,但每个内部向量管理不相关的整数范围。

如果您想要连续存储,请考虑一个大小为1000000×10的单vector<int>并大步访问它。

答案 1 :(得分:0)

  

是在连续空格中分配的嵌套向量吗?

没有!从内部向量分配的空间将不保证是连续的!只有矢量实例本身才会出现在由外部矢量管理的连续内存部分中。