C ++风格的向量-指针数组还是数组?

克尔兹斯托夫·斯坦尼斯瓦维克

我正在编写简单的模板,矢量样式的类,并且想知道哪种方法更好-将元素收集为普通数组还是指针数组?第二种方法应确保更快地复制数组,但需要更多的指针存储空间。

我对吗?还有其他性能后果吗?

贾斯汀

我正在编写简单的模板,矢量样式的类,并且想知道哪种方法更好-将元素收集为普通数组还是指针数组?

所有std::vector<>实现都选择一个“普通数组”-元素的连续分配。在考虑性能之前,请考虑所需的语义。

使用指针会使您的实现复杂化。同样,这将破坏std::vector<>保证元素连续分配的保证。

使用指针意味着更多的簿记。同样,它将需要其他分配来维护和间接分配。尽管使用基础指针具有一些优点,但是简单类型的简单结构可以更快地复制。通常,您应该将连续分配作为默认设置。如果您发现使用指针有很大的好处,请在另一种类型中使用它。

还要注意,向量操作(如移动和交换)只能通过将指针交换到数组来实现,因此您可以提高某些操作的指针速度。

现有的矢量设计是一个很好的起点。

连续分配的最大好处是在缓存上很容易。内存读写比将元素的内存分散到各处要快得多。

另一点:指针的大小可以大于一个值/元素。在这种情况下,使用指针可以增加内存需求。

第二种方法应确保更快地复制数组,但需要更多的指针存储空间。

为何如此?您仍然需要复制元素并跟踪其生命周期以获取适当的语义。在这种情况下,shared_ptr如果您打算共享向量的元素,则简单的向量s是值得考虑的方法。通常,shared_ptr应该很少使用它,因此您可能需要重新考虑您的设计。使用std::vector<>的设计作为起点绝对没有错,因为它是一个很好的默认设置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章