1. 函数调用原理 执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似)。 2. 内联函数 内联函数提供了另一种选择。编译器将使用相应的函数代码替换函数调用。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。
3. 内联函数的使用 在函数声明前加上关键字inline; 在函数定义前加上关键字inline。 ?:
#include<iostream> inline double square(double x){return x*x;} int main() { using namespace std; double a,b; double c = 13.0; a = square(5.0); b = square(4.5+7.5); cout<<"a="<<a<<",b="<<b<<endl; cout<<"c="<<c<<endl; cout<<"c squared="<<square(c++)<<endl; cout<<"now c="<<c<<endl; return 0; }结果如下: a=25,b=144 c=13 c square=169 now c=14 4. 内联函数和宏定义的区别 C语言使用预处理器语句#define来提供宏。如下例所示: #define SQUARE(X) XX 宏定义时通过文本替换开实现的–X是参数的符号标记。 a = square(5.0);->a=5.05.0; b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5 d = square(c++);->d=c++c++ 可以看出,对于b,需要使用括号才能正常运算。 #define SQUARE(X) ((X)(X)) 对于c,却仍递增了两次。 因此,宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常。
5. 何时使用内联函数 如果执行函数代码的时间比处理函数调用机制的时间长,则节省的时间占比很小。若代码执行时间很短,则内联函数就可以节省函数调用的时间。 [原文地址]
(https://www.cnblogs.com/shijingjing07/p/5523224.html)