gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:21 26 4
gpt4 key购买 nike

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

看看这个,这就是我通常使用 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?

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

最佳答案

如果性能至关重要,那么也许您应该尽可能地分析一切。

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

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

vector 也有一些调整/优化的实现,比如 folly::fbvector 但你应该仔细考虑(再一次,分析)你是否需要像那个。

至于清除 vector ,请查看 vector::resize - 如果您正在调整大小(由于迭代器失效),它实际上保证不会重新分配。所以你可以调用 resize(0) 而不是 clear 只是为了确定。

关于c++ - 我应该使用 std::vector + 我自己的大小变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42196876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com