面试题答案
一键面试场景
在返回对象较大且不希望发生对象拷贝时,使用函数返回常量引用能带来性能优化。比如返回一个较大的数组对象或者复杂自定义类对象时,若直接返回对象会进行拷贝构造,消耗额外的时间和空间,而返回常量引用避免了这种拷贝。
代码示例
#include <iostream>
#include <vector>
class BigData {
public:
std::vector<int> data;
BigData() {
for (int i = 0; i < 10000; ++i) {
data.push_back(i);
}
}
};
const BigData& getBigData() {
static BigData data;
return data;
}
int main() {
const BigData& result = getBigData();
// 这里可以使用result进行相关操作,比如访问result.data
return 0;
}
优化原理
- 避免拷贝:如果函数
getBigData
返回的是BigData
对象而不是常量引用,在调用getBigData()
时会调用拷贝构造函数创建一个临时对象,然后将这个临时对象赋值给result
。而返回常量引用,result
直接引用了函数内的静态对象data
,避免了拷贝构造和析构临时对象的开销,从而提升性能。 - 静态对象生命周期:这里返回的是静态对象的引用,保证在函数调用结束后对象依然存在,且通过常量引用避免了对该对象的意外修改。