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

标签 c++ arrays pointers vector containers

我正在编写简单的模板, vector 样式类,我想知道哪种方法更好 - 收集普通数组或指针数组中的元素? 第二种方式应该确保更快地复制数组,但需要更多内存用于指针。

我说得对吗?还有其他性能影响吗?

最佳答案

I'm writing simple template, vector-style class and I'm wondering, which way is better - to collect elements in normal array, or in array of pointers?

全部std::vector<>实现选择“普通数组”——元素的连续分配。在考虑性能之前,请考虑您需要的语义。

使用指针会使您的实现变得非常复杂。另外,它会打破std::vector<>保证元素是连续分配的。

使用指针意味着更多的簿记工作。此外,它还需要额外的分配来维护和间接。尽管使用底层指针有一些优点,但简单类型的更简单结构可以更快地复制。一般来说,您应该选择连续分配作为默认值。如果您发现指针的大小写有很大的好处,请在其他类型中使用它。

另请注意,诸如移动和交换之类的 vector 操作可以通过交换数组的指针来实现,因此您可以为某些操作提供指针速度。

现有的 vector 设计是一个非常好的起点。

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

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

Second way should ensure faster copying of array, but needs more memory for pointers.

怎么会这样呢?您仍然需要复制元素并跟踪它们的生命周期以获得正确的语义。在这种情况下,一个简单的 vector shared_ptr如果您的目的是共享 vector 的元素,则 s 是一种值得考虑的方法。一般来说,shared_ptr应该很少使用,因此您可能需要重新考虑您的设计。使用 std::vector<> 绝对没有任何问题的设计作为起点,因为它是一个很好的默认值。

关于C++ 风格的 vector - 指针数组还是数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732605/

相关文章:

pointers - 在go中找到常量的地址

c++ - Qt : How to cast QTableRowItem to Object?

arrays - 如何在 Perl 中找到一个数组中而不是另一个数组中的元素?

c++ - 使用模板将数组作为引用作为参数传递

c - 尝试根据另一个数组中的正数创建一个数组

c++ - 将指针复制到分配的内存

c++ - 如此处所述,使用指向指针的指针可以解决类成员的非更新问题吗?如果是如何?

c++ - 使用导致段错误的类在 C++ 中实现堆栈

c++ - 你的测试应该有多详细/粒度?

c++ - 为什么使用 `std::map::find` 来检查 map 是否有 key ?