1.直接返回与局部对象
毫无疑问,局部对象的构造和析构会造成开销。如下示例:
class TestObject
{
public:
TestObject(){
memset(data, 0, sizeof(data));
std::cout << "Construct" << std::endl;
}
TestObject(const TestObject &val){
memcpy(data, val.data, sizeof(data));
std::cout << "Copy Construct" << std::endl;
}
TestObject & operator=(const TestObject &val){
memcpy(data, val.data, sizeof(data));
std::cout << "operator =" << std::endl;
return *this;
}
~TestObject(){
std::cout << "Destructor" << std::endl;
}
public:
double data[1000];
};
TestObject getObject()
{
TestObject test;
test.data[0] = 100;
return test;
}
int _tmain(int argc, _TCHAR* argv[])
{
TestObject a = getObject();
return 0;
}
程序执行结果:
可以看到,getObject()函数中的局部对象test的构造和析构造成了额外的开销。
2.引用传值
最容易想到的一种消除局部对象方法是引用传值。添加如下函数:
void getObjectRef(TestObject &val)
{
val.data[0] = 100;
}
测试代码: