我正在编写简单的模板,矢量风格的类,我想知道,哪种方式更好 - 收集普通数组或指针数组中的元素? 第二种方法应该确保更快地复制数组,但需要更多内存用于指针。
我是对的吗?还有其他表现后果吗?
答案 0 :(得分:1)
为什么你现在担心表现?另外,普通(C风格)数组必须具有编译时大小,并且实际上并不需要任何fanc内存管理,所以你真的没有多少选择。
另外,复制速度如何与底层数据相关?如果有N个字节,则任何一种方法都需要复制N个字节。
答案 1 :(得分:1)
我正在编写简单的模板,矢量风格的类,我想知道,哪种方式更好 - 在普通数组或指针数组中收集元素?
所有std::vector<>
实现都选择“普通数组” - 连续的元素分配。在考虑性能之前,请考虑您需要的语义。
使用指针可能会使您的实现变得非常复杂。此外,它会打破std::vector<>
保证元素是连续分配的。
使用指针意味着更多的簿记。此外,还需要额外的分配来维护和间接。简单类型的简单结构可以更快地复制,尽管使用底层指针具有一些优点。通常,您应该将连续分配作为默认值。如果您发现指针的情况有很大好处,请以其他类型使用它。
另请注意,移动和交换等向量操作只能通过将指针交换到数组来实现,因此您可以为某些操作指定速度。
现有的矢量设计是一个非常好的起点。
连续分配的最大好处是它在缓存上很容易。内存读取和写入比将元素的内存分散到各处要快得多。
另一点:指针的大小可以大于一个值/元素。在这种情况下,使用指针可以增加内存需求。
第二种方法应该确保更快地复制数组,但需要更多内存用于指针。
怎么样?您仍然需要复制元素并跟踪它们的生命周期以获得正确的语义。在这种情况下,shared_ptr
s的简单向量是值得考虑的方法,如果您的目的是共享向量的元素。通常,shared_ptr
应该使用得很少,因此您可能需要重新考虑您的设计。使用std::vector<>
的设计作为起点绝对没有错,因为这是一个很好的默认设置。
答案 2 :(得分:0)
您似乎想要实现自己的矢量模板?不要这样做,而是使用现有的STL containers之一。
除了评估指针与平面数据决策的“性能”相关性之外, 还有很多工作要做 。