【发布时间】:2015-01-24 14:25:33
【问题描述】:
我有以下问题:
假设我有一个包含 100 个对象的向量,因此创建一个副本会很糟糕。
class MyClass
{
private:
vector<MyObject> mVector;
};
//return by reference
vector<object>& MyClass::GetVector1()
{
return mVector;
}
vector<object>* MyClass::GetVector2()
{
return &mVector;
};
通过引用返回速度很快并且不生成副本。 该向量在 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!
但是如果在创建对象时我无法初始化向量怎么办? 假设我有一个 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。
如果您不再需要返回的对象并且它可能会被破坏,则可以使用按值返回,这没关系,因为编译器可能会通过移动来优化它,但您可以显式使用移动语义并移动类中的向量,因为向量元素是动态分配的并且容器是可移动的。检查此链接:Is returning by rvalue reference more efficient?
【问题讨论】:
-
不要将智能指针视为指针,而是根据所包含指针的所有权来看待它们。
-
你为什么不让告诉你的人详细说明?
-
所以我必须使用指针或引用,但原始指针不是坏的吗?
-
@slei:如果您尝试使用它们来管理所有权或指向可能被破坏的事物,它们会很糟糕。如果您只是想指向比指针寿命更长的东西,它们还不错。
-
在其他论坛有人告诉我,这样的指针可能会导致意外的错误,这应该是一个更好的解决方案:(使用无容器的示例)
std::shared_ptr<const std::string> _test; const std::shared_ptr<const std::string>& GetTest() const { return _test; }
标签: c++ pointers reference return