c++ - 为什么当我试图返回一个 const 引用时会出现 vector 复制?

标签 c++ vector stl

我正在测量我在 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/

相关文章:

c++ - 使用 Openscenegraph 加载纹理时出错

c++ - 如何从 vector 初始化 valarray?

c++ - C++模板特化的思考

java - 将 vector 转换为列表

c++ - 在 C++ 应用程序的使用中需要对数组、 vector 和映射进行说明

c++ - 如何将 vector<bool> 或 bitset 按位存储到文件中?

c++ - 为什么 value_type 函数在 SGI STL 中返回一个指针

c++ - 如何降低该程序中大数据集输入的时间复杂度?

c++ - 通过网络同步视频播放

c++ - 未调用 dll Hook 函数