【问题标题】:Time/memory efficient work with std::vector使用 std::vector 节省时间/内存
【发布时间】:2018-01-27 00:35:42
【问题描述】:

我目前正在实现 Astar 算法,其中每个节点都存储在向量中,然后返回到外部对象 - 像这样:

class Astar
{
   std::vector<Node> find()
   {
      std::vector<Node> open;
      std::vector<Node> closed;
      std::vector<Node> path;

      //A_star algorithm working with open and closed vectors
      //when path found fill path with push_back()

      return path;
   }
}

在外部对象代码看起来类似于这样:

class Foo
{
   Astar astar;
   std::vector<Node> path;
   void findPath()
   {
      path = astar.find();
   }
   //do stuff with path
}

findPath() 存在的原因是我想让它在另一个线程中运行,所以如果找到路径 - 做一些事情,否则 - 也许是时候找到路径了(简化)。困扰我的是path = astar.find();,因为它可以进行大量复制(更不用说Astar 类中的push_back() 也复制值)。

我想到的可能解决方案是:将 Foo 的 std::vector&lt;Node&gt; path; 引用作为参数传递给 Astarfind(); 或在 FooAstar 之间建立友谊,因此 Foo 可以访问私有路径。在我之前是时间和内存效率(时间超过内存)。

【问题讨论】:

  • 如果你对它进行基准测试,我相信你会感到惊讶。做一些关于复制省略的研究,以及一般的返回值优化。以及一些关于move语义的研究。
  • 你可能想使用reserve()来减少find()的复制和移动。

标签: c++ performance c++11 vector


【解决方案1】:

首先请记住,C++ 允许 Return Value Optimization,因此按值返回向量本身不是问题。

但是:

  • 重复分配可能只分配一次的对象的成本很高。因此,理论上您可以让该方法获取路径的某个缓冲区的引用或指针,这必须保证有足够的内存。这样,外部代码甚至只分配一次,并且可以重复使用其缓冲区进行重复调用。
  • 构造一个您不打算使用它的对象的成本很高。因此,您可能需要一个名为 has_path(const Node&amp; source, const Node&amp; target) 的方法,甚至是具有该功能的独立函数。

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 2015-06-13
    • 2014-03-26
    • 2011-02-11
    • 1970-01-01
    • 2016-04-04
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多