一、内联函数
内联函数可避免函数调用的开销:
在大多数机器上,一次函数调用其实包含着一系列工作:
1、调用前要先保存寄存器,并在返回时恢复;
2、可能需要拷贝实参;
3、程序转向一个新的位置继续执行;
将函数指定为内联函数(inline),通常就是将它在每个调用点上“内联地”展开.
一般来说,内敛机制用于优化规模较小、流程直接、频繁调用的函数。很多编译器都不支持内敛递归函数。
(内联说明只是向编译器发出的一个请求,编译器可选择忽略这个请求)
二、constexpr函数
constexpr函数是指用于常量表达式的函数。定义constexpr函数的方法与其它函数类似,不过要遵循几项约定(constexpr函数被隐式地指定为内联函数):
1、函数的返回类型及所有形参的类型都得是字面值类型
2、函数体中有且仅有一条return语句。
constexpr size_t scale(size_t cnt)
{
return 8*cnt;
}
调用如上程序,只要传入的参数是一个常量表达式,则能返回一个常量表达式。相反若传入一个变量,则会出错。
请把内联函数和constexpr函数放在头文件中!
和其它函数不一样,内敛函数和constexpr函数可以在程序中多次定义,因为编译器想要展开函数仅有函数声明是不够的,还需要函数的定义。不过,对于某个给定的内联函数或者constexpr函数来说,它的多个定义必须一致。基于这个原因,内联函数和constexpr函数通常定义在头文件中。
(这里有个链接是总结头文件和源文件应该放哪些内容的https://www.cnblogs.com/fenghuan/p/4794514.html)
三、调试帮助
程序可以包含一些用于调试的代码,但是这些代码应该只在开发程序的使用,当程序完成,准备发布时,应屏蔽掉调试代码。这种方法用到两项预处理功能assert和NDEBUG。
assert预处理宏(在cassert头文件里)
assert是一种预处理宏,所谓的预处理宏,就是一个预处理变量,它的行为有点类似内联函数。assert宏使用一个表达式作为它的条件;assert(expr);
先对expr求值,如果表达式为假(0),assert输出信息并终止程序运行;如果表达式为真(非0),assert什么都不做。assert(word,size() > threshold)
//当字符串的长度小于某个值,就会终止程序。
NDEBUG预处理变量
assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做,默认状态下没有定义NDEBUG,此时assert将执行运行时检查。但assert只是调试程序的一种辅助手段,并不能代替真正的运行时的逻辑检查,也不能代替程序本身应该包含的错误检查。除了assert外,也可以使用NDEBUG编写自己的条件调试代码。