我应该使用 std::vector + 我自己的大小变量吗?
Should I use std::vector + my own size variable or not?
注意:性能在我的应用程序中非常关键!
为最坏的情况分配足够的缓冲区存储是避免重新分配的要求。
看看这个,我平时就是这样用的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 + 我自己的大小变量还是 std::vector + reserve + push_back + clear + size?
我不喜欢让另一个大小变量浮动,但是 clear() 函数很慢(线性时间)并且 push_back 函数有边界检查的开销。我需要在每一帧的恒定时间内重置大小变量,而不需要在线性时间内调用任何析构函数和 运行。
结论:我不想破坏我的旧数据,我只需要重置当前 size/current 每帧插入元素变量的数量。
如果性能很重要,那么也许您应该尽可能地分析一切。
如果您可以确定事先不需要重新分配,则使用您自己的大小变量会有所帮助(这就是您所做的 - 递增 currVectorSize
而不进行检查),但在这种情况下为什么要使用 std::vector
在所有?只需使用数组或 std::array
。
否则(如果可能发生重新分配)您仍然需要将您的大小变量与实际向量大小进行比较,因此这与 push_back
所做的几乎相同并且不会给您带来任何好处。
还有一些 vector
的 tweaked/optimized 实现,例如 folly::fbvector
,但您应该仔细考虑(并再次说明)您是否需要类似的东西。
至于清除向量,请查看 vector::resize
- 如果您正在调整大小(由于迭代器失效),它实际上保证不会重新分配。所以你可以调用 resize(0)
而不是 clear
只是为了确定。
注意:性能在我的应用程序中非常关键! 为最坏的情况分配足够的缓冲区存储是避免重新分配的要求。
看看这个,我平时就是这样用的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 + 我自己的大小变量还是 std::vector + reserve + push_back + clear + size?
我不喜欢让另一个大小变量浮动,但是 clear() 函数很慢(线性时间)并且 push_back 函数有边界检查的开销。我需要在每一帧的恒定时间内重置大小变量,而不需要在线性时间内调用任何析构函数和 运行。 结论:我不想破坏我的旧数据,我只需要重置当前 size/current 每帧插入元素变量的数量。
如果性能很重要,那么也许您应该尽可能地分析一切。
如果您可以确定事先不需要重新分配,则使用您自己的大小变量会有所帮助(这就是您所做的 - 递增 currVectorSize
而不进行检查),但在这种情况下为什么要使用 std::vector
在所有?只需使用数组或 std::array
。
否则(如果可能发生重新分配)您仍然需要将您的大小变量与实际向量大小进行比较,因此这与 push_back
所做的几乎相同并且不会给您带来任何好处。
还有一些 vector
的 tweaked/optimized 实现,例如 folly::fbvector
,但您应该仔细考虑(并再次说明)您是否需要类似的东西。
至于清除向量,请查看 vector::resize
- 如果您正在调整大小(由于迭代器失效),它实际上保证不会重新分配。所以你可以调用 resize(0)
而不是 clear
只是为了确定。