C ++ - 样式向量 - 指针数组还是只是数组?

时间:2014-02-12 15:44:31

标签: c++ arrays pointers vector containers

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

我是对的吗?还有其他表现后果吗?

3 个答案:

答案 0 :(得分:1)

为什么你现在担心表现?另外,普通(C风格)数组必须具有编译时大小,并且实际上并不需要任何fanc内存管理,所以你真的没有多少选择。

另外,复制速度如何与底层数据相关?如果有N个字节,则任何一种方法都需要复制N个字节。

答案 1 :(得分:1)

  

我正在编写简单的模板,矢量风格的类,我想知道,哪种方式更好 - 在普通数组或指针数组中收集元素?

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

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

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

另请注意,移动和交换等向量操作只能通过将指针交换到数组来实现,因此您可以为某些操作指定速度。

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

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

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

  

第二种方法应该确保更快地复制数组,但需要更多内存用于指针。

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

答案 2 :(得分:0)

您似乎想要实现自己的矢量模板?不要这样做,而是使用现有的STL containers之一。

除了评估指针与平面数据决策的“性能”相关性之外, 还有很多工作要做