在线咨询
有事点这里
有事点这里
看不懂这篇文章?联系我们
("麦洛克菲"长期致力于内核安全的推广与普及,我们更专业!)
求职QQ群:223902435。讨论各种求职笔试面试问题
作者:admin 时间:2015-10-31
标题:const,inline与#define的区别

#define宏与constinline的比较。可以通过下面的两种形式来定义圆周率:

#define    PAI  3.1415926      //宏定义

const float pai = 3.1415926   //常变量

C语言中的宏在编译的时候,编译器只对宏进行简单的替换。在C++中通过const定义一个常变量与C语言中的宏定义相比,常变量具有拥有类型、可调试、可进行参数合法性检查等优点。

下面来看看inline关键字与#define宏的区别:

 

#define  MAX(a, b) a > b ? a : b

class A

{

public:

     inline int getMax(int a, int b);

    

    

}

int A::getMax(int a, int b)

{

     return a > b ? a : b;

}

 

首先,为什么要使用宏呢?宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。但是宏容易产生二义性,也不能访问对象的私有成员,这是宏的局限。

对于宏的二义性,来看看下面的例子。从下列选项中选择不会引起二义性的宏定义是:

 

A #indefine POWER(x)   x*x

B #indefine POWER(x)   (x)*(x)

C #indefine POWER(x)    (x*x)

D #indefine POWER(x)   ((x)*(x))

分析:

A#indefine POWER(x)     x*x

如果调用POWER(5+6),本意是 (5+6)*(5+6)=121,实际却是:5+6*5+6=41

B#indefine POWER(x)     (x)*(x)

如果调用POWER(5+6)/POWER(5+6),本意是得到结果为1,实际却是:(5+6)*(5+6)/(5+6)*(5+6)=11*11/11*11=121

C#indefine POWER(x)(x*x)

如果调用POWER(5+6)+POWER(5+6),本意是 (11*11)+(11*11)=121+121=242,实际却是: (5+6*5+6)+(5+6*5+6)=41+41=82

D.没有二义性。

为了利用宏的优点克服宏的不足便引入了inline机制。内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

加上了inline关键字的函数,编译器将用它的代码直接进行替换。对于那些代码较少而调用频率较高的函数适合用inline关键字,减小了函数在执行时候的堆栈维护开销。