考虑下面的类,并假设myVector变量将存储一个非常大的整数向量
Class MyClass {
Private:
std::vector<int> myVector;
Public:
std::vector<int> GetVector();
// some other functions that allow me to set myVector
};
std::vector<int> MyClass::GetVector() {
return myVector;
}
在某些函数中,我需要使用MyClass对象的myVector变量进行一些计算。
制作这个非常大的矢量的副本是否更好,比如
int function (MyClass object) {
std::vector<int> vector = object.GetVector();
for (int i = 0 ; i<vector.size();i++){
// Do something using vector[i]
};
return 0;
}
或者每次都打电话,像这样
int function (MyClass object) {
for (int i = 0 ; i<object.GetVector().size();i++){
// Do something using object.GetVector()[i]
};
return 0;
}
或者最终无关紧要?
答案 0 :(得分:2)
避免巨大对象的传值更好。你应该通过引用来代替。因为看起来你在object
内修改了function
所以你需要传递非const引用,否则它应该是const MyClass &object
int function (MyClass &object)
同样在GetVector
中,您应该返回对myVector
的引用,不需要按值返回。
std::vector<int> & MyClass::GetVector() {
return myVector;
}
答案 1 :(得分:2)
如果它真的很大并且你不会写入对象或函数内部的向量通过参考传递Object
int function(const MyClass &object)
并在类中创建一个const方法
const std::vector& getVector()
然后你可以通过调用向量来复制函数中的引用,并且你不必经常调用.getVector()
答案 2 :(得分:0)
出于性能原因,如果要在显示的两个选项之间进行选择,制作副本然后迭代它应该会更好。但是,实际上,不返回向量本身而是返回(常量)对它的引用会好得多。
一个好的经验法则是,如果使用复合类型,尤其是容器,则可以使用const&
来代替传递值。请记住在const vector&
对象被销毁后不要使用MyClass
。如果还没有超出范围,它将成为所谓的悬空引用,其中访问将导致未定义的行为。在使用const&
而不是复制某些内容时,这是最重要的注意事项。
如果在包含对象死亡后仍需要存活,则应考虑使用std::shared_ptr<T>
。它将使对象保持活着,直到没有人再需要它为止,这意味着任何引用托管对象的内容都不会被保留(简化)。