内联函数-模板-宏定义

内联函数:

  内联函数的编译代码与其他代码内联起来,也就是说,编译器将使用相应的函数代码代替函数调用。对于内联代码,程序无需跳转至;另一位置执行代码,再调回来。因此内联函数的运行速度比常规函数快,但代价是需要消耗很多内存的。如果程序在10个不同的地方调用同一内联函数,则该程序将包含该函数代码的10个副本。

  内联函数的定义用inline

内联函数的规则:

  1>  一个函数可是自己调用自己,称为递归调用,含有递归调用的函数不能设置为inline;

  2> 使用了复杂流程控制语句:循环语句和switch语句,无法使用内联函数;

  3> 由于inline增加体积特征,所以建议内联函数内的代码应该较小。

  4> 内联函数仅作为一种“请求”,待定的情况下,编译器不会理会inline关键字,而强制让函数成为普通的函数,编译器会给出警告;

  5> 在你调用一个内联函数前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译器,但是该函数没有实现inline.

函数模板: 

  模板是使用泛型来定义函数。通过将类型作为参数传递给模板,可是编译器生成该类型的函数。

  其定义是:

emplate<class 数据类型参数标识符1,…,class 数据类型参数标识符n>

<返回类型><函数名>(参数表)

{

     函数体

}

 

宏定义:

  宏定义不能值传递。

宏定义的优点:

  1>提高了程序的可读性,同时也方便进行修改;

  2>提高程序的运行效率:使用带参的宏定义即可完成函数调用的功能,又能避免函数的出栈入栈操作,减少系统开销,提高运行效率;

  3>宏是预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。

宏定义的缺点:

  1>由于直接侵入,所以代码可能相对多一些;

  2>嵌套定义过多可能会导致程序的可读性,而且很容易出错;

  3>带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。

预编译语句仅仅是简单的值替代,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患,

#define SQUARE(X) X*X

SQUARE(4.5 + 1.5) ---> 4.5 + 1.5 * 4.5 + 1.5 

所以定义SQUARE要是 

#define SQUARE(X) ((X)*(X))

eg2:

SQUARE(X++)  将X递增了两次。

宏并不是函数,宏并不是语句,宏并不是类型定义

原文地址:https://www.cnblogs.com/chenyang920/p/5325760.html