c++ - 优化:我可以避免在这个循环中动态分配向量吗?
问题描述
我想了解是否可以避免在以下代码中动态分配向量:
#include <vector>
int main() {
std::vector<int> vec;
while (predictate()) {
int curr_size = foo();
vec.resize(curr_size);
bar(vec);
}
};
perf
表明循环中大约 30% 的时间都花在了 functionvec.resize(curr_size)
上。是否可以在不过多更改程序中涉及的函数的 API 的情况下消除调整向量大小所花费的时间?我可以想到以下方法:
- 我相信使用 a
std::array
而不是 a可以避免动态重新分配。std::vector
- 的大小的上限
vec
是已知的。因此我可以只分配一次内存并curr_size
用作内部的端点bar
。 - 我想知道是否
std::vector
允许重置向量结束指针,但我找不到这样做的方法。那可能吗?
可以采取哪些步骤来避免花时间调整矢量的大小?我没有这种优化的经验,很高兴听到更多有根据的建议。我很感激任何提示或建议!
解决方案
重新分配是昂贵的。如果预先预留足够的空间,则可以避免在循环内发生任何重新分配:
#include <vector>
int main() {
std::vector<int> vec;
vec.reserve( max_size ); // reserve enough space
while (predictate()) {
int curr_size = foo();
vec.resize(curr_size); // no rellocations when curr_size <= max_size
bar(vec);
}
};
如果您可以更改bar
为采用迭代器,则无需调整大小(仍然假设您知道 的最大值foo()
):
std::vector<int> vec( max_size );
while (predictate()) {
int curr_range = foo();
bar(vec.begin(), vec.begin() + curr_range);
}
推荐阅读
- c# - 将事件序列化为 JSON
- netbeans - 如何让 NetBeans 12.0 在 Mac 上启动(MAC OS 11.0 beta / Big Sur)
- reactjs - 如何在图表中的 x 轴上显示自定义值?
- python - Pycharm,安装下一个解释器后创建新项目时 SRE 模块不匹配
- docker - 无法在 Docker 中实现 WatchTower
- javascript - 使用 DOM 事件调用 Javascript 函数
- makefile - 如何编写多个文件夹makefile
- json - 按包名动态加载 json 文件(Typescript)
- javascript - QML 用 JavaScript 定义焦点链序列
- python - 如何按 Pandas 中重新设计的案例组对时间戳数据进行排序?