快速可变大小的容器 C++

fast variable size container c++

本文关键字:C++      更新时间:2023-10-16

我正在制作一个国际象棋引擎,并且通过优化遇到了砖墙。使用探查器后,我发现移动生成是最大的因素。当我仔细观察时,发现生成移动的大部分时间都花在了调用 std::vector.push_back(move) 上,当我找到一个移动时。

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

有人有遇到过这类问题吗?如有必要,我会编写自己的容器,但我觉得应该有一种标准的方法。

在以下push_back()调用之前调用具有足够大小的std::vector::reserve(),以避免一次又一次地重新分配内存。

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

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

  3. 或者你可以尝试push_back一个动作的shared_ptr,然后提前保留一些数字,这样内存浪费就会减少。

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

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

您可以使用

std::vector并在适当的位置调用其保留方法。

我使用这种分析方法

push_back是一个大的时间占用者,我并不感到惊讶,reserve应该解决这个问题。

但是,如果您再次分析,您可能会发现其他事情是重要的计时者,例如调用newdelete您的move对象。

修复它(通过池化),然后再次执行。现在,其他事情会很大。

每次这样做时,你都会得到一个加速系数,这些因素会成倍增加,直到你对结果感到非常满意。

相关文章:
  • 没有找到相关文章