欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 在什么情况下适合用inline C++ 的函数中,什么时候要写inline
在什么情况下适合用inline C++ 的函数中,什么时候要写inline
2019-07-24 20:24:45 来源:朵拉利品网

1, C++ 的函数中,什么时候要写inline



这涉及一个效率问题。记住,调用函数的开销是很大的,所谓的空间开销是指调用函数前,先要将原来的函数保存在寄存器(占用寄存器空间)里面,并在调用结束后恢复。调用函数时,还要复制实参(占用内存空间)。如果被调用函数一旦调用频繁,就会花费很多空间。如果你有一段“短小而频繁调用的函数”,内联是个不错的选择。
“如果含有复杂的分支或循环结构,我使用inline会有什么后果?”
事实上,所谓内联,是编译器将内联函数在函数调用点上展开函数代码。例如
inline int small(int a,int b) { return a

2, 关于C++中的inline函数



内联函数:
在C++中,为了避免主函数过于复杂,编程时会设置大量的子函数,而这样做降低了主函数的复杂性的同时却使得整个程序的执行效率降低,因为在进行函数调用时,系统需要时间及内存空间来保存现场信息,为了解决这个问题,C++中设了内联函数的概念(inline函数)。
在函数编写过程中,内联函数的编写完全遵循子函数的编写规则,这样就使得代码同样都是比较简便的,然而不同之处出现在代码编译过程中,代码编译时会用内联函数主体替换函数调用部分,从而使得编译完成的程序是顺序执行下去的而不必再进行函数调用。
我们看下面的函数,函数体中只有一行语句:
double Average(double total, int number)
{
return total/number;
}
定义这么简单的函数有必要吗?实际上,它还是有一些优点的:第一,它使程序更可读;第二,它使这段代码可以重复使用。但是,它也有缺点:当它被频繁地调用的时候,由于调用函数的开销,会对应用程序的性能有损失。例如,Average在一个循环语句中重复调用几千次,会降低程序的执行效率。
那么,有办法避免函数调用的开销吗?对于上面的函数,我么可以把它定义为内联函数的形式:
inline double Average(double total, int number)
{
return total/number;
}
函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频繁地调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
使用内联函数时应注意以下几个问题:
(1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。
(2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。
(3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。
(4) 内联函数要在函数被调用之前声明。例如下面的代码将内联函数放在函数调用之后声明,不能起到预期的效果。

相关概念


函数

函数的定义:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示。我们把这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。

函数调用

函数调用是计算机编或运行时,使用某个函数来完成相关命令。对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。