欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 内联函数与外联函数的区别 内联函数和外联函数有什么区别
内联函数与外联函数的区别 内联函数和外联函数有什么区别
2019-07-24 20:20:58 来源:朵拉利品网

1, 内联函数和外联函数有什么区别



在类的定义中规定在类体中说明的函数作为类的成员,称为成员函数。前面讲过一般的成员函数,它是根据某种类的功能的需要来定义的。又讲述了一些特殊的成员函数:构造函数、析构函数、拷贝初始化构造函数等。还有一些成员函数后面还会介绍。
成员函数除了说明和定义在类中之外,还有些什么特性,这是本节讨论的问题。
一、内联性和外联函数
类的成员函数可以分为内联函数和外联函数。内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。而说明在类体内,定义在类体外的成员函数叫外联函数。外联函数的函数体在类的实现部分。
内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度。
内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义,因为内联函数遵循函数的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,调试比较方便。
外联函数变成内联函数的方法很简单,只要在函数头前面加上关键字inline就可以了。
#include
using namespace std;
class A
{
public:
A(int x, int y) //内联函数
{
X=x;Y=y;
}
int a() //内联函数
{
return X;
}
int b() //内联函数
{
return Y;
}
int c();
int d();
private:
int X,Y;
};
//inline定义内联函数
inline int A::c()
{
return a()+b();
}
inline int A::d()
{
return c();
}
void main()
{
A m(3,5);
int I=m.d();
cout}
输出结果:
d()return:8
说明:类A中,直接定义了3个内联函数,又使用inline定义了2个内联函数。内联函数一定要在调用之前进行定义,并且内联函数无法递归调用。
区别就在于,运行时侯的效率与定义的方法不同。

2, 类里面的成员函数与内联函数的区别



1.内联函数可减少cpu的系统开销,并且程序的整体速度将加快,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数.
2.有两种内联函数的声明方法,一种是在函数前使用inline关见字,另一种是在类的内部定义函数的代码,这样的函数将自动转换为内联函数,而且没必要将inline放在函数前面.
3.内联是一种对编译器的请求,下面这些情况会阻止编译器服从这项请求.
如果函数中包含有循环,switch或goto语句,递归函数,含有static的函数.
由此可以看出,内联函数和成员函数没什么区别,区别就在于怎样加快函数的执行速度而已。

4, 内联函数和宏定义的区别



C++中的内联函数提供了宏之上的功能。宏是内联代码的简单实现形式。。不过两者有很大的区别。
内联函数采用的是值传递,而宏定义采用的是对等替换。这一点非常重要,宏定义没用好,很可能在使用过程中陷入误区。
例如下面这个宏:
#define MAX(a, b) a>b?a:b
当我们这样使用宏时,没有什么问题: MAX( num1, num2 ); 因为宏展开后变成 num1>num2?num1:num2;。 但是,如果是这样调用的,MAX( 17+32, 25+21); 呢,编译时出现错误,原因是,宏展开后变成:17+32>25+21?17+32:25+21,Woh,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
#define MAX( (a), (b) ) (a)>(b)?(a)b)
即使是这样,也不这个宏也还是有Bug,因为如果我这样调用 MAX(i++,j++); , 经过这个宏以后,i和j都被累加了两次,这绝不是我们想要的。所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个50行的宏,程序中有1000个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。因此,在决定是用函数,还是用宏时得要小心。
相同点:两者都是在预处理阶段,对代码块,进行替换。。

5, c++内联函数和普通函数的区别在哪里?请举例说明



内联函数和普通函数的区别只有在两个地方有意义:
1 考试
2 编译器
因为到底内联不内联,如何内联,都是编译器说了算。
请看如下一段代码:
int func1()
{
DWORD ct = ::GetTickCount();
if( 0 == (ct % 2) )
return 0;
else
return 1;
}
__forceinline int func2()
{
DWORD ct = ::GetTickCount();
if( 0 == (ct % 2) )
return 0;
else
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = func1();
int b = func2();
cout return 0;
}
在Debug时,即使func2被申明为最严格的__forceinline,他也不会内联,反汇编代码为:
;int a = func1();
call func1 (0F81168h)
mov dword ptr [a],eax
;int b = func2();
call func2 (0F81163h)
mov dword ptr [b],eax
可见func2 并未进入main函数内部。在Release的时候:
;int a = func1();
mov edi,dword ptr [__imp__GetTickCount@0 (0CB2000h)] ;将GetTickCount函数的地址放入EDI
call edi ;调用GetTickCount
movzx esi,al ;调用结果在EAX中,将EAX地位存在在ESI中
and esi,1 ; 相当于取余2的操作
;int b = func2();
call edi ;再次调用GetTickCount获取时间
cout mov ecx,dword ptr [__imp_std::endl (0CB2040h)] ;将endl 对象指针放入ECX
movzx eax,al
and eax,1 ;这两句取余2结果
push ecx ;传递参数endl
mov ecx,dword ptr [__imp_std::cout (0CB2038h)] ;读取cout对象
add eax,esi ;完成加法
push eax ;传递参数a + b
call dword ptr [__imp_std::basic_ostream>::operator00CB102E mov ecx,eax
00CB1030 call dword ptr [__imp_std::basic_ostream>::operator可见,两个函数全部被内联了,在func2的内联中,甚至将取余数的操作放在了cout 因此,一般情况下,内联都是编译器说了算,这里情况非常多,你强制它内联,最后结果不一定内联,你不指定内联,他也可能自动内联。
有一种情况,如果你将类在.h文件中申明,一部分在.h中实现,并申明强制内联,这部分函数一般会被内联的。

6, 在面向对象中内联函数和公有成员函数有什么区别呢?



应该在执行的速度上有区别,对于内联函数,VC编译连接是是把它的实现代码直接插入入到调用该函数的地方。
而公有函数或其它函数在调用它们时,系统要进行保护当前现场、参数入栈等工作,然后转去执行被调用的函数的函数体;当执行完后,系统还要恢复现场,接着再执行后面的语句。
所以同样的函数执行过程,内联函数要比其它函数快,它是一种用存储空间换取时间的方法
不过对于用户指定的内联函数,编译器不一定把他当做内联函数处理。用户在说明内联函数是只是向编译器请求当出现这种函数调用时作为内联函数来实现,而不是命令编译器这样去做

8, C++内联函数可以调用内联函数吗



称为成员函数。前面讲过一般的成员函数,它是根据某种类的功能的需要来定义的。又讲述了一些特殊的成员函数:构造函数、析构函数、拷贝初始化构造函数等。还有一些成员函数后面还会介绍。
成员函数除了说明和定义在类中之外,还有些什么特性,这是本节讨论的问题。
一、内联性和外联函数
类的成员函数可以分为内联函数和外联函数。内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。而说明在类体内,定义在类体外的成员函数叫外联函数。外联函数的函数体在类的实现部分。
内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度。
内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义,因为内联函数遵循函数的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,调试比较方便。
外联函数变成内联函数的方法很简单,只要在函数头前面加上关键字inline就可以了。
#include <iostream>
using namespace std;
class A
{
public:
A(int x, int y) //内联函数
{
X=x;Y=y;
}
int a() //内联函数
{
return X;
}
int b() //内联函数
{
return Y;
}
int c();
int d();
private:
int X,Y;
};
//inline定义内联函数
inline int A::c()
{
return a()+b();
}
inline int A::d()
{
return c();
}
void main()
{
A m(3,5);
int I=m.d();
cout<<"d()return:"<<I<<endl;
}
输出结果:
d()return:8
说明:类A中,直接定义了3个内联函数,又使用inline定义了2个内联函数。内联函数一定要在调用之前进行定义,并且内联函数无法递归调用。
区别就在于,运行时侯的效率与定义的方法不同。

相关概念


函数

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