首页 > 解决方案 > 优化:我可以避免在这个循环中动态分配向量吗?

问题描述

我想了解是否可以避免在以下代码中动态分配向量:

#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 的情况下消除调整向量大小所花费的时间?我可以想到以下方法:

可以采取哪些步骤来避免花时间调整矢量的大小?我没有这种优化的经验,很高兴听到更多有根据的建议。我很感激任何提示或建议!

标签: c++optimizationmemory

解决方案


重新分配是昂贵的。如果预先预留足够的空间,则可以避免在循环内发生任何重新分配:

#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);
    }

推荐阅读