[C++] inline内联函数使用方法
C++支持内联函数,目的是为了提高函数的执行效率,类似于C语言中的宏定义
内联函数在调用时将它在程序中的每个调用点展开,不用额外分配栈空间
内联函数的定义在一个源文件中出现一次,但在多个源文件中可以同时出现,只要保证完全相同即可。
所以内联函数可以直接在头文件中定义,即使被多次包含,也是完全相同的,因此不会报错。
inline 内联函数的使用方法:
inline 放在函数定义的返回值前面,就可以将函数指定为内联函数;仅仅放在声明函数前面时无效的
inline 返回值 函数名(形参)
{
函数体
}
举例:
#include <iostream> using namespace std; // add 函数定义时有inline,声明时没有inline,但依然是内联函数
int add(int a, int b);
// dec 函数定义时没有inline,声明时有inline,但依然不是内联函数
inline int dec(int a, int b); inline int add(int a, int b)
{
return (a + b);
} int dec(int a, int b)
{
return (a - b);
} int main(void)
{
// 调用add(2, 3)时直接被替换为(2 + 3)
cout << add(, ) << endl;
// 调用时不会替换,要进行压栈出栈操作
cout << dec(, ) << endl; return ;
}
注意:
1、内联函数以代码增大的代价减少函数调用的开销,禁止滥用,只有函数体简单短小,才可以使代码更加高效
2、如果函数代码较长或有循环语句,使用内联函数会增大内存的消耗,不能使用内联函数
宏定义与内联函数的区别
1、宏定义是由预处理器控制实现,而内联函数是通过编译器控制实现
2、宏定义在预处理时就对其进行展开替换,而内联函数是在调用时对其展开替换
3、内联函数是真正的函数,但使用时像宏定义一样展开,取消了函数的参数压栈出栈的开销
4、宏定义不检查参数返回值等,只是对其展开,而内联函数会检查参数返回值等,相对更安全
5、宏定义在运行时不可以调试,而内联函数可以
[C++] inline内联函数使用方法的更多相关文章
- inline 内联函数
1.目的: 引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数的引入可以减少程序的目标代码,实现程序代码和数据的共享.但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转 ...
- c++——inline内联函数
1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3; #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以 ...
- C++语言基础(7)-inline内联函数
函数调用是有时间和空间开销的.程序在执行一个函数之前需要做一些准备工作,要将实参.局部变量.返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码:函数体中的代码执行完毕后还要清理现场,将之前压 ...
- CG_INLINE,inline 内联函数
内联函数,即在编译的时候将函数体替换函数调用,从而不需要将parameter,return address进行push/pop stack的操作,从而加速app的运行,然而,会增加二进制文件的大小. ...
- (inline)内联函数在IOS开发中的使用
今天在阅读YYKit源码(https://github.com/ibireme/YYKit.git)时发现在YYKitMacro.h组件中大量使用的内联函数,例如此文件中的一个函数 static in ...
- inline内联函数
demo //带参数的宏 #define MYFUNC(a, b) ((a) < (b) ? (a) : (b)) inline int myfunc(int a, int b) { retur ...
- C++ inline内联函数
inline 函数避免函数调用的开销 // find longer of two strings const string &shorterString(const string &s ...
- 《C++ Primer》笔记-inline内联函数
inline 函数避免函数调用的开销 // find longer of two strings const string &shorterString(const string &s ...
- C++对C语言的拓展(2)—— inline内联函数
C语言中有宏函数的概念.宏函数的特点是内嵌到调用代码中去,避免了函数调用 的开销.但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错. 1.内联函数基本概念 C++提供了 in ...
随机推荐
- rsync安全
rsync可能泄露敏感文件 常用操作列举整个同步目录或指定目录:Defaultrsync 10.0.0.12:: rsync 10.0.0.12::www/ 下载文件或目录到本地:Defaultrsy ...
- appium 设备信息字典(desired_caps)
操作系统类型.操作系统版本.设备名称.要操作的APP应用的包名.activity名称desired_caps = { "platformName":"Android&qu ...
- Node: Process模块 (Features of Process)
Process模块 (Features of Process) process is a global variable which indicates the current Node.js pro ...
- form组件 初始化
class MyForm(Form): user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), initial=2, widget= ...
- 《linux就该这么学》课堂笔记02 虚拟机安装使用
这节学习了虚拟机安装RHEL系统,了解了shell.以及命令的格式
- 2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest- H. Rikka with A Long Colour Palette -思维+贪心
2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest- H. Rikka with A Long Colour Palette -思维+贪心 [Proble ...
- Charles 4.2.1 HTTPS抓包
Charles 4.2.1 HTTPS抓包 Charles iPhone抓包 Mac必须与iPhone连接同一WiFi Proxy -> SSL Proxying Settings -> ...
- Kotlin反射实践操作详解
继续对反射进行实战. 获取构造方法: 先定义一个主构造方法,2个次构造方法,接下来咱们用反射来获取一下构造方法: 其结果: [fun <init>(kotlin.Int, kotlin.S ...
- python测试开发django-rest-framework-64.序列化(serializers.Serializer)
前言 REST framework中的serializers与Django的Form和ModelForm类非常像.我们提供了一个Serializer类,它为你提供了强大的通用方法来控制响应的输出, 以 ...
- springboot的第一节课
快速开始spring boot应用 官方向导搭建boot应用 地址:http://start.spring.io/ 设置项目属性: 3.解压,拷贝到工作空间,导入maven项目 4.写Controll ...