三、内联函数
定义内联函数当函数很小,例如小于10行
定义:
你可以定义内联函数使得在使用到内联函数的地方进行展开,而不是像普通函数一样通过函数调用机制进行调用。
优点:
只要内联函数够小,就能产生更高效的目标代码。可以随意的内联访问存储器和其他短、关键的方法。
缺点:
过度的使用内联函数会使得程序变慢。代码的大小直接取决于内联函数的大小。内联一个很小的函数会减少代码量,然而内联一个很大的函数将大大的增加代码量。在现代的处理器上,小的代码将会因更好的运用指令缓存而运行更快。
决定:
一个经验之谈就是:别内联一个超过10代码的函数。小心析构函数,它通常比显示出来的代码量要大由于成员和基类的析构函数调用。
四、-inl.h文件
包含复杂内联函数的头文件,应该为文件名加上-inl.h后缀
内联函数的定义需要放在头文件中,这样编译器才能获取有效的内联函数定义在内联函数的调用处在进行代码插入。然而,实现代码适当的放在cpp文件,我们并不喜欢在头文件放过多的实现代码,除非那样做有可读性和性能上的优势。
如果一个内联函数很小,逻辑简单,你可以把实现代码放在头文件。例如,存取函数就应该放在类定义中,为了实现和调用方便更加复杂的内联函数也应该房子头文件。即使那样做会使得头文件变的不灵活,你可以把这些比较复杂的内联函数代码分开放在-inl.h后缀的文件。这把实现从类定义中分离,在需要这些实现代码的地方进行包含即可。
inl.h文件的另外一个用法就是在方法模版的定义。这将使方法模版的定义更容易读懂。
最后别忘了,inl.h文件和其他头文件一样,也是需要#define 保护的。
五、函数参数的顺序
定义函数,参数的顺序应该是:输入在前,后面是输出。
C/C++函数的参数类型,无非是输入,输出或者两者兼有。输入参数通常是一个值或者const引用;输入参数或者输入输出参数是非const指针。对函数参数排序时,把仅仅作为输入的参数放在任何输出参数之前。需要特别说明的是,不要因为是新增加的参数就把参数放在函数后面。把仅仅作为输入的参数放在输出参数之前。
当然这并不是必须遵守的规则,因为其中还包含输入输出参数,这使得这个规则更加难以遵守。
六、包含文件的命名和顺序
使用标准的顺序使代码更具有可读性和避免隐性关联关系:C链接库,C++链接库,其他库头文件,工程头文件。
所有的工程头文件应该一项目源文件结构来排列,而且不能包含UNIX。例如google-awesome-project/src/base/logging.h应该这样被包含:
#include "base/logging.h"
主要用于实现或者测试dir2/foo2.h的dir2/foo2.h or dir/foo_test.cc
文件中,其包含头文件如下:
- dir2/foo2.h
- C system files.
- C++ system files.
- Other libraries' .h files.
- Your project's .h files.
这样的一种排序,如果dir2/foo2.h 漏掉了一些必需的包含,生成dir/foo.cc or dir/foo_test.cc将会被中断。这样就能保证生成中断首先被发现,清楚问题在这些文件中而不是在其他的包中。
dir/foo.cc 和 dir2/foo2.h 通常在相同的目录下,当然也有可能是在不同的目录下。
在每个部分中,可以安装字母顺序。
举例说吧,google-awesome-project/src/foo/internal/fooserver.cc包含可以如下:
#include "foo/public/fooserver.h" // Preferred location.
#include <sys/types.h>
#include <unistd.h>
#include <hash_map>
#include <vector>
#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h"