gpt4 book ai didi

c++ - 指针、引用或智能指针?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:18 25 4
gpt4 key购买 nike

我有以下问题:

假设我有一个包含 100 个对象的 Vector,因此创建一个拷贝会很糟糕。

class MyClass
{
private:
vector<MyObject> mVector;
};

//return by reference
vector<object>& MyClass::GetVector1()
{
return mVector;
}

vector<object>* MyClass::GetVector2()
{
return &mVector;
};

通过引用返回很快并且不生成拷贝。该 vector 在 MyClass 中应该仍然可用,因此我不想移动它。但是使用此 GetVector() 方法的最佳方式是什么?

class MyOtherClass
{
private:
vector<MyObject>* myVector;
vector<MyObject>& myVector2;
vector<MyObject> myVector3;

MyClass m;
};

myVector2 = m.GetVector1(); //only works in an initializer list!

但是如果我不能在创建对象时初始化 vector 怎么办?假设我有一个 OnInit() 方法,它会在需要时被调用:

void MyOtherClass::OnInit()
{
myVector = m.GetVector2(); //no copy using return by reference
myVector = &m.GetVector1(); //no copy returning a pointer
myVector3 = m.GetVector1(); //copy
}

很多人告诉我使用像 myVector 这样的指针非常糟糕,但为什么呢?????我应该改用 smart_pointers 吗? (请给我一个例子,如何将它们与上面给定的代码一起使用)

或者是否有更好的方法来获得更快的性能?

编辑:

对于答案,请在下面检查我为此选择的答案。

另外我想添加移动语义。

但这在很大程度上取决于代码的目的,有时你真的想复制,你将无法避免。如果您知道该对象比跟踪它的代码持续时间更长,那么只要您也希望应用更改,指针就可以,否则使用 const ref。

如果您不再需要返回的对象并且它可能会被销毁,您可以使用按值返回,这没关系,因为编译器可能会通过移动来优化它,但您可以显式地使用移动语义并移动vector 脱离类,因为 vector 元素是动态分配的并且容器是可移动的。检查此链接:Is returning by rvalue reference more efficient?

最佳答案

公共(public)对象没问题

那时只有一个公共(public)对象。你不需要那个getter:

struct X {
std::vector<Y> vec;

X(..) : vec(..) { .. }
};

然后你可以简单地使用它:

X x(..);
x.vec.some_member_function();

auto& z = x.vec;
z.vec.some_member_function();

如果你真的需要

如果你真的需要使用成员函数版本,那么使用 return by reference,这更符合习惯,尽管它在性能方面与 return by pointer 性能基本相同:

vector<Y>& X::GetVector() {
return mVector;
}

然后将其用作:

X x(..);
x.GetVector().some_member_function();

auto& z = x.GetVector();
z.some_member_function();

智能指针不适用于此

智能指针解决了处理资源和描述所有权的问题。在这种情况下,鉴于 std::vector 已经在内部拥有并处理自己的资源,它们没有多大意义。

关于c++ - 指针、引用或智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27146103/

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