C++ 使用std::vector进行时间/内存高效工作
我目前正在实现一种Astar算法,其中每个节点存储在vector中,然后返回到外部对象-如下所示:C++ 使用std::vector进行时间/内存高效工作,c++,performance,c++11,vector,C++,Performance,C++11,Vector,我目前正在实现一种Astar算法,其中每个节点存储在vector中,然后返回到外部对象-如下所示: class Astar { std::vector<Node> find() { std::vector<Node> open; std::vector<Node> closed; std::vector<Node> path; //A_star algorithm working wit
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;
}
}
类Astar
{
std::vector find()
{
std::矢量开放;
std::向量闭合;
向量路径;
//一种适用于开闭向量的_星算法
//找到路径时,使用push_back()填充路径
返回路径;
}
}
在外部,目标代码类似于以下内容:
class Foo
{
Astar astar;
std::vector<Node> path;
void findPath()
{
path = astar.find();
}
//do stuff with path
}
class-Foo
{
阿斯塔阿斯塔;
向量路径;
void findPath()
{
path=astar.find();
}
//用路径做一些事情
}
之所以存在findPath()
,是因为我想让它在另一个线程中运行,所以如果找到了路径——做些事情,否则——也许是时候找到路径了(简化)。困扰我的是path=astar.find()代码>因为它可能需要大量复制(更不用说Astar
类中的push_back()
也会复制值)
我想到的可能解决方案是:传递Foo的std::vector路径代码>引用作为Astar
的find()的参数
或在Foo
和Astar
之间建立友谊,以便Foo
可以访问私有路径。在我之前是时间和内存效率(时间超过内存)。首先记住C++允许,因此按值返回向量本身不是问题。
然而:
- 重复分配可能只分配一次的对象代价很高。因此,从理论上讲,您可以让该方法为路径获取指向某个缓冲区的引用或指针,必须保证该缓冲区具有足够的内存。这样,外部代码甚至只分配一次,并且可能会重复使用其缓冲区进行重复调用
- 构建一个您不打算使用的对象是昂贵的。因此,您可能希望名为
的方法具有_path(const Node&source、const Node&target)
,甚至是具有该功能的独立函数
如果您对其进行基准测试,我相信您会感到惊讶。具体研究了复制省略和返回值优化。以及一些关于移动语义的研究。您可能希望使用reserve()
来减少在find()
中的复制和移动。