我正在编写简单的模板, 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/