1) 变virtual函数为普通函数
调用virtual函数比普通函数多出两到三个指令。如果能够把不必要的virtual函数改为普通函数,能提高效率。
关于virtual函数,可参考
http://blog.csdn.net/yeming81/archive/2010/06/16/5673139.aspx
2) 返回值优化
l 未优化前
Integer Func( const Integer& left, const Integer& right)
{
Integer a();
return a;
}
这个函数首先会构造a,然后拷贝到返回值创建的临时对象;两次构造,两次析构。
l 优化后
Integer Func( const Integer& left, const Integer& right)
{
return Integer();
}
编译器直接对返回值临时对象位置上构造一个Integer对象;一次构造,一次析构(在Debug版可以看出这种优化)。
但是,如果Release版编译时,编译器已经给你优化了,所以返回值优化本身在Release版存在了,怎么写结果都一样。
一个举例
class A
{
public:
A(){cout<<"A()"<<endl;}
~A(){cout<<"~A()"<<endl;}
A(const A& right)
{
cout<<"Copy A()"<<endl;
}
A& operator = (const A& right)
{
cout<<"operator="<<endl;
}
};
A ReturnA()
{
A a;
return a;
}
A ReturnAOpt()
{
return A();
}
A& ReturnARef()
{
A a;
return a;
}
A& ReturnARefOpt()
{
return A();
}
int _tmain(int argc, _TCHAR* argv[])
{
{
ReturnA(); //Debug: 1次A(),次copy A(),2次~A();
A a = ReturnA();//Debug: 1次A(),次copy A(),2次~A();
ReturnAOpt(); // Debug: 1次A(), 1 次~A();
A b = ReturnAOpt(); // Debug 1次A(), 1 次~A();
ReturnARef(); // Debug: 1次A(), 1 次~A();
A& c = ReturnARef();// Debug 1次A(), 1 次~A();
ReturnARefOpt();// Debug: 1次A(), 1 次~A();
A& d = ReturnARefOpt();// Debug: 1次A(), 1 次~A();
}
getchar();
return 0;
}