我写了一个类似
的课程class Mesh {
public:
vector<Vertex> vs;
}
其中Vertex
是
class Vertex {
public:
const double x, y, z;
}
我有一个从文件中加载Mesh
的函数:
shared_ptr<Mesh> load_mesh(string filename) {
//....
vector<Vertex> vs;
Vertex v(1, 2, 3);
vs.push_back(v);
return shared_ptr<Mesh>(Mesh(vs));
}
我的问题涉及Vertex
和vector
。
一个或两个是否会超出范围?
哪种(如果有的话)替代品是首选的?
class Mesh1 {
public:
vector<shared_ptr<Vertex>> vs;
}
class Mesh2 {
public:
shared_ptr<vector<Vertex>> vs;
}
class Mesh3 {
public:
shared_ptr<vector<shared_ptr<Vertex>>> vs;
}
或者有更好/更简单的方法来处理这个问题吗?
答案 0 :(得分:1)
你的基本结构对我来说是正确的。您正在将Vertex
复制到vector
,然后将vector
复制到Mesh
。 load_mesh()
函数中的本地副本将超出范围,但因为您已制作好的副本。
冒着被指责过早优化的风险,我会说除非vector
很小,否则复制效率都会有点低。可以通过多种方式对其进行优化。使用C ++ 11和move semantics,您可以保留当前结构,只需移动数据:
#include <vector>
struct Vertex {
const double x, y, z;
Vertex(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
};
struct Mesh {
std::vector<Vertex> vs;
Mesh(std::vector<Vertex> _vs) : vs(std::move(_vs)) {}
Mesh(Mesh&& other) noexcept : vs(std::move(other.vs)) {} // Move constructor
};
Mesh
loadMesh() {
//....
std::vector<Vertex> vs;
vs.emplace_back(1,2,3);
return Mesh{std::move(vs)};
}
int main() {
auto mesh = loadMesh();
}
我正在使用emplace_back
代替push_back
在Vertex
就地构建vector
并使用std::move
移动vector
进入Mesh
。
返回shared_ptr<Mesh>
会很好,但我想告诉您也可以按值返回Mesh
。编译器应该执行RVO并且不会有副本(see this question)。