快速变量大小的容器c ++

时间:2014-01-13 05:40:01

标签: c++ optimization stl

我正在制作一个国际象棋引擎,并且通过优化打了一堵砖墙。使用剖析器后,我发现移动生成是最重要的因素。当我仔细观察时,事实证明,当我找到一个动作时,花费大量时间生成动作就是调用std :: vector.push_back(move)。

有没有办法让动态大小的c ++容器快速?它不能是固定大小的数组,因为我无法提前知道将产生多少移动(尽管通常少于50个)。

有没有人有过这类问题的经验?如有必要,我会写自己的容器,但我觉得应该有一个标准的方法来做到这一点。

5 个答案:

答案 0 :(得分:4)

在进行以下std::vector::reserve()调用之前调用push_back()足够的大小,以避免重复分配内存。

答案 1 :(得分:1)

  1. Vector :: reserve()帮助。您可以尝试分析并查看移动次数的分布,并尝试提前预留最佳数量。不要担心内存浪费,因为当你有32 - 50次移动时,保留的内存可能是64,浪费14 - 32.所以保留8或甚至16的内存可能不会占用更多内存。

  2. 您是否需要按索引访问移动?为什么不使用std :: list?

  3. 或者您可以尝试push_back一个移动的shared_ptr,然后提前预留一些数字,浪费更少的内存。

答案 2 :(得分:1)

您是否尝试使用std::deque进行分析?如果您不要求以连续的方式分配对象,那么它可能是最佳解决方案。它为前面提供恒定时间插入和擦除;如果您需要在序列的两端插入或擦除,通常会std::deque

您可以在GotW 54中阅读详细信息。

答案 3 :(得分:0)

您可以使用std::vector并在适当的位置调用其reserve方法。

答案 4 :(得分:0)

我使用this method of profiling

push_back是一个重要的时间,reserve应该解决这个问题并不让我感到惊讶。

但是,如果您再次发布个人资料,您可能会发现其他一些事情是最重要的时间,例如您new个对象的deletemove来电。

修复(通过合并),并再次执行此操作。现在,其他东西将会很大。

每次执行此操作时,您都会获得一个加速因子,并将这些因子相乘,直到您对结果非常满意为止。