内联函数和宏定义的总结
2016-03-30 23:18
155 查看
内联(inline)函数,不同于普通函数的是:普通函数是在编译是和调用者分别编译,运行到调用处时,将原函数的信息入栈,新函数执行。而内联函数,在编译时就直接把调用函数语句替换为整个内联函数代码(变量名对应替换),运行行时这些就当做一条条语句执行,不必再调用、切换函数。
可见:
内联函数的优点:节省时间,减少了运行时函数调用的时间开销(参数值传递,主调函数和被调函数运行栈的切换)。
缺点:占用空间,每调用一次就要替换一次函数代码,编译生成的目标代码可能很长。
总体讲就是以空间换时间。
在使用内联函数时,应注意如下几点:
1.在内联函数内不允许用循环和判断语句不能递归,否则编译将该函数当做普通函数处理。内联函数一般只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对于整个函数来说非常小,所以也没有必要用内联函数实现。
2.内联函数的定义必须出现在内联函数第一次被调用之前。
3.在C++中,在类的内部定义了函数体的函数,即使没有inline修饰,被默认为是内联函数。
宏定义和内联函数类似,都是以空间换时间,都能一定程度上加快程序的执行。
宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
宏定义将宏名替换为字符串。
但二者有差别:
1.宏定义是在预处理阶段由预处理器替换,内联函数是在编译时编译器执行。
2.内联函数还是有函数的特性,而宏定义真的只是简单的字符串替换,容易出现一些问题。
例如:#define MULTI(x) (x*x)
在某个函数中调用MULTI(3+3),理想结果是6*6=36,而事实上3+3*3+3=15
所以宏定义的变量一般要加括号,这是一个注意点,也是一种好习惯:
#define MULTI(x) ((x)*(x))
但即使这样,还是会出问题:
当调用a=2; b= MULTI(a++); 后 理想是b=4,a=3,而事实上b=4,a加了两次a=4。
为了解决这些问题可以用内联函数替代宏定义,就不会发生这些错误。
可见:
内联函数的优点:节省时间,减少了运行时函数调用的时间开销(参数值传递,主调函数和被调函数运行栈的切换)。
缺点:占用空间,每调用一次就要替换一次函数代码,编译生成的目标代码可能很长。
总体讲就是以空间换时间。
在使用内联函数时,应注意如下几点:
1.在内联函数内不允许用循环和判断语句不能递归,否则编译将该函数当做普通函数处理。内联函数一般只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对于整个函数来说非常小,所以也没有必要用内联函数实现。
2.内联函数的定义必须出现在内联函数第一次被调用之前。
3.在C++中,在类的内部定义了函数体的函数,即使没有inline修饰,被默认为是内联函数。
宏定义和内联函数类似,都是以空间换时间,都能一定程度上加快程序的执行。
宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
宏定义将宏名替换为字符串。
但二者有差别:
1.宏定义是在预处理阶段由预处理器替换,内联函数是在编译时编译器执行。
2.内联函数还是有函数的特性,而宏定义真的只是简单的字符串替换,容易出现一些问题。
例如:#define MULTI(x) (x*x)
在某个函数中调用MULTI(3+3),理想结果是6*6=36,而事实上3+3*3+3=15
所以宏定义的变量一般要加括号,这是一个注意点,也是一种好习惯:
#define MULTI(x) ((x)*(x))
但即使这样,还是会出问题:
当调用a=2; b= MULTI(a++); 后 理想是b=4,a=3,而事实上b=4,a加了两次a=4。
为了解决这些问题可以用内联函数替代宏定义,就不会发生这些错误。
相关文章推荐
- Unity连接MySQL数据库
- Tarjan算法详解
- 关于alter table move
- flow的简单使用
- C/C++中的预编译指令
- 软件工程_东师站_第四周作业
- python使用httplib2访问REST服务的例子
- 1.3-puppet安装
- 视频播放器(二)——播放列表
- Qt实现记事本的打开和保存功能(第一个实用的Qt小程序)
- Nginx下的https配置
- Java 异常
- 如何阅读一本书
- Android libpng error: Not a PNG file错误解决
- 每天学点Excel技巧-Day3
- 怎样将 MySQL 迁移到 MariaDB 上?
- React Native环境搭建
- 6.伪静态(3) --- 防盗链
- 【dotnet跨平台】VSCode Linux 32位和Linux 64位下载地址分享
- LeetCode110—Balanced Binary Tree