gpt4 book ai didi

c++ - 如何在 C++11 中返回类成员 vector

转载 作者:可可西里 更新时间:2023-11-01 16:01:30 34 4
gpt4 key购买 nike

我读了几篇关于如何从方法返回 vector 的文章,包括这些:

  1. c11 rvalues and move semantics confusion return statement

  2. want speed pass by value

  3. why does visual studio not perform return value optimization rvo

  4. Wiki - Return Value Optimization

我仍然对如何在 VS2013 中以正确的方式传递 vector 以及此代码中以下方法之间的区别感到困惑(问题在注释中标记):

class Foo{
private:
std::vector<int> vect;

public:
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}

//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}

//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}

//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}

//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
}

所以我不确定//1 是否是//2 的显式形式,不确定 3 是否有效。 4和5有什么区别?如何测试 RVO 是否适用于 VS2013 中的 vector ?

最佳答案

//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}

这太丑了,你仍然需要一个拷贝,而且你的界面太复杂了。

//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}

//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}

功能相同,但您可能希望 3 指示 getVect 不会更改您的类状态,因此可以正确应用 const 语义。

//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}

你似乎不太可能想要这个,在调用 GetVect 之后,内部 vect 将不再包含任何元素。

 //5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}

这最终应该与 4 相同,您只需更明确地调用返回对象的移动构造函数即可。

对于性能,您可能真正想要的是:

const std::vector<int>& GetVect() const
{
return vect;
}

这样你就可以读取对象而不需要复制。如果要写入返回的 vector ,请显式创建一个拷贝。更多详细信息,请参阅 this question

关于c++ - 如何在 C++11 中返回类成员 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760475/

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