【发布时间】:2021-03-26 03:02:27
【问题描述】:
我想了解是否可以在以下代码中避免动态分配向量:
#include <vector>
int main() {
std::vector<int> vec;
while (predictate()) {
int curr_size = foo();
vec.resize(curr_size);
bar(vec);
}
};
perf 表明循环内大约 30% 的时间用于函数 vec.resize(curr_size)。是否可以在不过多更改程序中涉及的函数的 API 的情况下消除调整向量大小所花费的时间?我可以想到以下方法:
- 使用
std::array而不是std::vector,因为我相信它可以避免动态重新分配。 -
vec大小的上限是已知的。因此,我可以只分配一次内存并使用curr_size作为bar内的端点。 - 我想知道
std::vector是否允许重置向量结束指针,但我找不到这样做的方法。这可能吗?
可以采取哪些步骤来避免花时间调整矢量大小?我没有这种优化的经验,很高兴听到更多有根据的建议。我很感激任何提示或建议!
【问题讨论】:
-
查看
std::vector::reserve(),在循环之前使用。 -
你能显示真实的代码吗?
resize不应该那么贵,如果你reserve足够的前面 -
resize从不缩小向量的容量。这意味着“浪费的时间”实际上应该只花在增长向量上的时间,如果你不知道最终的大小是多少,你就必须这样做。
标签: c++ optimization memory