C++高效程序设计(二)

2014-11-24 13:06:02 · 作者: · 浏览: 1
在所有用到这个函数的模块中包含这个.h文件。也许这并不想你想象中的那么美好,不过它的确可以正常工作。

事实上,考虑到隐藏实现的问题(我是个面向对象偏执狂),我并不喜欢这个方法。但是最近我的确使用这个方法编写了很多类。有一个好处是,我不需要输入inline这个关键字――如果你把整个函数定义放进类定义中,编译器会自动的把它看成inline函数。如果一个类的所有函数都应该是inline的,那么我就把整个类定义及实现都写进头文件中。我建议你只在真正迫切的需要提高运行速度时才这样做,当然,你也不在意太多的人share你的代码。


第三节 搭乘类高速列车
设计执行速度快的类是C++程序设计的关键。我用一个3d向量类来说明这个问题(这在我的工作中是很常见的类)。事实上,就在前几个星期,我刚刚完成了一个向量类。在编写这个类的一个月里,我犯下了太多错误。

一个向量类是必须的,因为工作中有大量的向量数学运算,显然每次都要反复书写相同的内容。如果你想提高编码效率,同时又不想牺牲代码运行速度,那么就要编写一个向量类,我的这一个叫作CVector3f(3f的意思是三个float数据)。为了提高代码的可读性和可维护性,我希望利用C++伟大的特性之一――运算符重载(operator overloading)实现一些运算符函数(+,-,*)。

在最初的设计中,我很快的实现了一个构造函数、一个拷贝构造函数、一个析构函数以及上面提到的那三个运算符。设计过程中,我没有特别考虑效率的问题,也没有使用inline函数,只是简单的把函数声明放入头文件,把函数实现放入.cpp文件中。

下一步是让它跑得更快。我做的第一件事是在头文件中将所有成员函数声明为inline函数。如果编译器真的将它们处理成inline函数,那么我们就可以节省下函数调用的额外开销。对于我的向量类中的那些小函数来说,执行速度有了显著的提升,不过对于那些较大的函数来说,这样做可能不会有明显的效果。

我想到的第二件事是:我们真的需要析构函数吗?正常情况下编译器会为我们生成一个空的析构函数,通常它会比我们写的析构函数效率更高。在我们的向量类中,并没有什么东西需要析构,那么为什么还要浪费时间?

运算符也可以跑得更快。先前的运算符函数大致如下:

CVector3f operator+( CVector3f v )
{
CVector3f returnVector;
returnVector.m_x = m_x + v.m_x;
returnVector.m_y = m_y + v.m_y;
returnVector.m_z = m_z + v.m_z;

return returnVector;
}

这段代码隐藏着众多的多余代码,着实令人烦恼。我们来仔细看看这段代码,代码的第一行声明并构造了一个临时变量。这就是说,这个对象的默认构造函数被调