【问题标题】:are nested vector allocated in consecutive space是在连续空间中分配的嵌套向量
【发布时间】:2013-11-07 17:45:21
【问题描述】:

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

之后我们可能会依次扫描向量几次。如果第 2 层向量被分配在连续空间中(可能很少有第 2 层向量可以放入缓存块中),则以下访问是有效的。但是,如果将第 2 层向量分配在不同的地方,每次离开内循环时,我们可能会跳转到随机的地方获取数据,这样效率不高。

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]++;
     }
}

此外,如果第 2 层向量首先分配在连续空间中。在我们 push_back 元素到向量中之后,它们可能会因为缺乏空间来原地扩展它们而被移动到其他空间。他们还会被关在附近吗?

谢谢。

EDIT1

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

【问题讨论】:

    标签: c++ performance memory vector stl


    【解决方案1】:

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

    如果您想要连续存储,请考虑使用大小为 1000000 × 10 的单个 vector&lt;int&gt; 并大步访问它。

    【讨论】:

    • 谢谢,是否有任何实现将它们放在一起以提高顺序扫描的性能?
    • @SiNZeRo.wentt:我在回答中描述了该实现:-S
    【解决方案2】:

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

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

    【讨论】:

    • 它可能是连续的,在常见的实现中有时(几乎)是连续的。但你的一般观点是成立的。
    • @tmyklebu 我知道内部向量不是分配在连续的空间中,而是它们的点存储在一起。您是否有任何参考资料表明它们可能通过某些实现几乎是为了提高效率而存储的。
    • @SiNZeRo.wentt 您可以提供一个专门的分配器作为外部向量的第二个模板参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2018-01-26
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多