1.优点

为什么使用内联函数,而不使用宏定义,虽然宏本身采用的展开来替代函数调用的压栈出栈返回等操作,提高了代码的效率,但是会有两个问题:

(1)边际效应

宏只是展开代码而已,所以在一些操作符的优先级问题使用上很容易出现异常。

#define ADD(x,y) x+y;

int _tmain(int argc, _TCHAR* argv[])
{
cout<<3*ADD(1,2);
return 0;
}

原意是要输出9,而实际上由于直接展开的关系,输出值为5。

(2)无法操作类的私有变量

2.原理

对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。

3.实现

3.1.inline声明

inline声明应该修饰在函数的定义,而不是函数的声明。

class A
{
public:
void f();
}; inline void A::f()//在定义中添加inline修饰符
{
cout<<"f()";
} int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.f();
return 0;
}

3.2.定义在类内的成员函数自动为内联函数

尽管没有inline修饰符,在类内进行定义的成员函数也是内联函数。

class A
{
public:
inline void f(){cout<<"f()";};//类内定义自动为内联函数
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.f();
return 0;
}

4.注意

那既然内联函数能提高效率,怎么不把所有的函数定义为内联?

注意,内联函数可以节省函数调用花费的时间,但是它是以代码复制为代价的,如果花费在函数体内的时间大于函数调用的时间,那是得不偿失的。

以下两种情况,慎重内联函数:

(1)函数体代码很长,每一处的内联都要进行代码的复制,对内存和速度消耗都是很大的。

(2)函数体内循环,那么执行的时间也会比函数调用的时间大。

正常情况下编译器会自动取消不值得内联的函数。

最新文章

  1. JavaScript判断IE版本
  2. ubuntu 搭建maven库 2.14.2-01并配置离线索引文件
  3. R 报错:package ‘***’ is not available (for R version ****) 的解决方案
  4. codeforces 300E Empire Strikes Back 数论+二分查找
  5. EF中使用SQL语句或存储过程(小笔记)
  6. python windows错误码
  7. python pip和easy_install使用方式(转载)
  8. Java [leetcode 7] Reverse Integer
  9. 数论/the second wave
  10. css3 3D变换和动画
  11. Android学习笔记(一)开发环境搭建
  12. ajenti试用感受
  13. JAVA17.1.12流程学习,潜心学习,少说多做,脚踏实地,一心一意。
  14. javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)
  15. CSAcademy Beta Round #5 Long Journey
  16. volatile&amp;synchronized&amp;diff
  17. 基础select语句详解
  18. jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题
  19. 【CF809E】Surprise me! 树形DP 虚树 数学
  20. C++(3):./Encryptor: undefined symbol:Z11startserviceLAKJDFLJALDKJFLLLLL

热门文章

  1. Qt 学习之路 :Repeater
  2. MapReduce输出格式
  3. [转] 函数编程之闭包漫谈(Closure)
  4. 使用JExcel导出excel文件
  5. Qapp使用总结
  6. 本地代码git到github上
  7. oracle重建、更新索引、索引统计信息命令
  8. Ant学习笔记(1) 基础知识
  9. 处理移动端click事件300ms延迟的好方法—FastClick
  10. Ant配置