我应该使用std :: vector +我自己的大小变量吗?

时间:2017-02-13 04:53:04

标签: c++ stdvector

注意:性能在我的应用中非常关键! 为最坏情况分配足够的缓冲存储是避免重新分配的必要条件。

看看这个,我通常使用std :: vector:

//On startup...
unsigned int currVectorSize = 0u;
std::vector<MyStruct> myStructs;
myStructs.resize(...); //Allocate for the worst case scenario!

//Each frame, do this.
currVectorSize = 0u; //Reset vector, very fast.

run algorithm...
//insert X elements in myStructs if condition is met
myStructs[currVectorSize].member0 = ;
myStructs[currVectorSize].member1 = ;
myStructs[currVectorSize].member2 = ;
currVectorSize++;

run another algorithm...
//insert X elements in myStructs if condition is met
myStructs[currVectorSize].member0 = ;
myStructs[currVectorSize].member1 = ;
myStructs[currVectorSize].member2 = ;
currVectorSize++;

Another part of the application uses myStructs and currVectorSize

我有一个决定问题,我应该使用std :: vector + resize +我自己的大小变量OR std :: vector + reserve + push_back + clear + size?

我不想让另一个大小变量浮动,但clear()函数很慢(线性时间),而push_back函数有边界检查的开销。我需要在每帧的常量时间内重置size变量,而不调用任何析构函数并以线性时间运行。 结论:我不想破坏我的旧数据,我只需要重置当前大小/当前数字插入元素变量每帧。

1 个答案:

答案 0 :(得分:0)

如果表现至关重要,那么也许您应该尽可能地描述一切。

如果您可以确定事先不需要重新分配,那么使用您自己的大小变量会有所帮助(这就是您所做的事情 - 在没有检查的情况下递增currVectorSize),但在这种情况下为什么要使用std::vector什么?只需使用数组或std::array即可。

否则(如果可能发生重新分配)你仍然需要将你的大小变量与实际的矢量大小进行比较,所以这与push_back几乎完全相同,并且不会为你带来任何好处。

还有一些vector的调整/优化实现,例如folly::fbvector,但你应该仔细考虑(并再次说明)你是否需要这样的东西。

至于清除向量,请查看vector::resize - 如果您正在调整大小(由于迭代器失效),实际上保证不会重新分配。因此,您可以致电resize(0)而不是clear,以确定。