将规模较小的操作定义成函数
缺点:
- 调用函数一般比求等价表达式的值要慢一些
- 在大多数机子上,一次函数调用其实包含着一系列工作:调用前要先保存寄存器,并且返回时回复:可能需要拷贝实参:程序转向一个新的位置继续执行。
内联函数
- 内联函数可避免函数调用的开销。
函数被指定为内联函数,通常在编译的时候将函数直接展开到调用的点。
constexpr 函数(被隐式的指定为内联函数,在编译过程中随时展开)
通常是指能用于常量表达式的函数。定义constexpr函数的方法与其他函数一样。
约定:
- 函数的返回值及其所有形参的类型都得是字面值类型
- 函数体中必须有且只有一条return语句。
- 函数体内也可包含其他语句。(可以有空语句,类型别名,以及using声明)
内联函数或则constexpr函数,它的多个定义必须完全一致,基于这个原因,内联函数和constexpr函数通常定义在头文件中。
调试帮助
assert预处理宏
assert (expr);
对expr求值,如果表达式为假,assert输出信息并且终止程序。如果为真,什么都不做。
NDEBUG预处理变量
assert 的行为依赖与一个名为NDEBU的预处理变量的状态,如果定义了NDEBUG则assert什么也不做,默认状态下没有定义NDEBUG,此时assert将执行检查。
可以定义一个NDEBUG来关闭assert
预处理器定义的程序调试很有用的定义
- func : 函数的名字
- FILE: 存放文件名的字符串字面值
- LINE: 存放当前行号的整型字面值
- TIME:存放文件编译时间的字符串字面值
- DATA:存放文件编译日期的字符串字面值。