c++ 自动对象、静态局部对象和内联函数
默认情况下,局部变量的生命期局限于所在函数的每次执行期间。只有当定义它的函数被调用时才存在的对象成为自动对象。自动对象在每次调用函数时创建和撤销。
局部变量所对应的自动对象在函数控制经过变量定义语句时创建。如果在定义时提供了初始化式,那么每次创建对象时,对象都会被赋予指定的初值。对于为初始化的内置类型局部变量,其初值不确定。当函数调用结束时,自动对象就会撤销。
形参也是自动对象。形参所占用的存储空间在调用函数时创建,而在函数结束时撤销。
自动对象,包括形参,都在定义它们的块语句结束时撤销。形参在函数块中定义,因此当函数的执行结束时撤销。当函数结束时,会释放它的局部存储空间。在函数结束后,自动对象和形参都不能再访问了。
一个变量如果位于函数的作用域内,但生命期跨越了这个函数的多次调用,这种变量往往很有用。应该将这样的对象对象定义为static。 static局部对象确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化。这种对象一旦被创建,在程序结束前都不会撤销。
函数调用:调用前先保存寄存器,并在返回时恢复;复制实参;程序还必须转向一个新位置执行。
inline函数避免函数调用的开销
将函数指定为inline函数,通常就是将它在程序中每个调用点上内联地展开。
cout << shorterString(s1, s2) << endl;
在编译时将展开为:
cout << (s1.size() < s2.size() ? s1: s2) << endl;
把inline函数放入头文件
inline函数的定义对编译器而言必须是可见的,以便编译器能够在调用点内联展开该函数的代码。此时,仅有函数原型是不够的。
inline函数可能要在程序中定义不止一次,只要inline函数的定义在某个源文件中出现一次,而且在所有源文件中,其定义必须完全相同。把inline函数的定义放在头文件中,可以确保在调用函数时所使用的定义是相同的,并保证对在调用点的定义对编译器可见。(在头文件中加入或修改inline函数时,使用了该头文件的所有源文件都 必须重新编译)