gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:51:05 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com