我正在测量我在 Debug模式下运行的一个小演示的性能。这些操作似乎需要很长时间,并且正在引发复制操作(或者在调试时出现):
// Get access to the vertices and faces
auto vertices = t.GetVertices();
auto faces = t.GetFaces();
该函数的实现是这样的:
std::vector<glm::vec3> const& GetVertices() const { return vertices_; }
std::vector<glm::ivec3> const& GetFaces() const { return faces_; }
在包含以下私有(private)成员的类中:
private:
std::vector<glm::vec3> vertices_;
std::vector<glm::ivec3> faces_;
无论出于何种原因,我都希望返回 const 引用会导致几乎为零的性能损失,但此操作似乎确实使程序陷入困境。我在这里错过了什么?这是否在 Release模式下得到优化,但总是在 Debug模式下发生?
最佳答案
为什么要复制内容?
vertices
的类型和 faces
将是 std::vector<glm::vec3>
和 std::vector<glm::ivec3>
, 分别。初始化它们时,编译器需要从返回的引用中复制内容。
编译器假定您不需要 vertices
的内容更改数据成员 vertices_
变化;因为这是您声明变量的方式。
如何防止这种情况发生?
如果您想将它们声明为引用,您必须明确说明:
auto const& vertices = t.GetVertices ();
auto const& faces = t.GetFaces ();
faces
的类型如何?和 vertices
推导?
具有表达式 auto foo = init
, foo
将具有为以下模板函数的参数推导的类型,称为 deduce_type (init)
作为参数。
template<class T> void deduce_type (T);
// auto vertices = t.getVertices ();
deduce_type (t.getVertices ()) // imaginary call, T = std::vector<glm::vec3>
是否有一些解决方法可以让我始终获得准确的类型?
不,目前不是,但在即将推出的 C++ 标准(C++14)中,您将能够执行以下操作,结果将是您想要的错误地期望您的原始代码执行以下操作:
decltype(auto) vertices = t.GetVertices ();
// ^-- vertices is of type `std::vector<glm::vec3> const&`
关于c++ - 为什么当我试图返回一个 const 引用时会出现 vector 复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24089286/