C++内联(inline)函数
内联函数
内联函数是一种特殊类型的函数,内联函数在定义或声明时前面加上“inline”关键字。比如:
inline int max(int a,int b)
{
return (a>b)?a:b;
}
内联(inline)是内联扩展(inline expansion)的简称。 C++编译器处理内联函数比较特殊:在遇到调用内联函数的地方会用函数体中的代码来替换函数的调用。比如下面的函数调用语句:
Int maximum=max(val1,val2);
在编译时会用函数max()的函数体展开:
Int maximum=((val1>val2)?val1:val2);
也就是说,程序执行时并没有真正调用函数max(),而是将内联函数的函数体中的语句直接在函数调用的地方展开了。
内联函数的作用:
引用内联函数的主要目的是即可以保证程序的可读性,又能提高程序的运行效率。函数的引入使得程序的结构比较清晰,可读性好,比如语句:
Int maximum = max(val1,val2);
就比下面的语句可读性好,容易理解:
Int maximum = ((val1>val2)?val1:val2);
而且,程序中可能很多地方都需要用到求两个数的最大值得操作,如果每次都写
(val1>val2)>val1:val2
显得非常麻烦,而用max(val1,val2)就显得简单、清楚得多。
但是,如果将求两个数的最大值这样逻辑非常简单的操作设计为一个一般的函数,系统执行函数调用需要进行栈空间的分配、状态入栈、参数传递等操作,函数的返回需要传递返回值、从栈中弹出信息、释放栈空间等操作,效率会比不使用函数低的多。想max()函数这样功能比较简单的函数,让系统为函数调用做那么多操作不值得,因此C++设计了内联函数,内联函数即可以获得函数的好处,又能提高程序运行效率。
内联函数的使用限制:
并不是所有的函数都能够设计为内联函数。C++对内联函数有很多限制:
1)在内联函数中不能定义任何静态变量;
2)内联函数中不能有复杂的流程控制语句,如循环、switch和goto语句;
3)内联函数不能是递归的;
4)内联函数中不能说明数组。
如果自己定义的函数比较复杂,违反了上面的定义,系统将忽略inline关键字,而视为一般的函数来处理。
所以,内联函数一般是比较小的、经常被调用的、大多可在几行写完的函数。如果函数比较复杂,函数调用和返回的开销相对来说就微不足道,没有必要用内联函数实现。
C++内联(inline)函数相关推荐
- C++学习--static函数,内联(inline)函数, 友元 (friend) 函数
简单总结一下C++中的各种特殊函数 1.static成员函数 定义在类体中,定义时在前面加static关键字: class Test{ static void getID(); } static 函数 ...
- C++类的内联成员函数应放在哪
今天复习C++ Primer的时候,看到了关于C++类的内联成员函数的放置,应该放在头文件中.那么这到底是为什么 呢?仅仅是一种代码规范问题还是必须这样做呢? 下面我就来讲讲我自己的理解吧.要彻底理解 ...
- SQL Server内联表值函数
In this article series, we will find basics and common usage scenarios about the inline table-valued ...
- 抽象数据类型(顺序栈)、断言、包含头文件、内联函数、非内联成员函数[C++ In Action][4]...
1. C++中的接口与实现思想, 即类的定义.数据成员的定义.函数原型在接口文件中进行, 实现代码放在实现文件中 2. 函数调用开销:调用前要先保存寄存器,并在返回点恢复:复制实参:程序必须转入一个新 ...
- c++ 类的内联成员函数
c++ 类的内联成员函数 1.什么是内联函数 在类的声明内部声明和定义的函数叫做内联成员函数,如下面例子,函数setA是普通的成员函数,函数setB是隐式的内联函数,函数setC是显式的内联函数. / ...
- 多语句表值函数与内联表值函数区别?
有几个例子要展示,以防万一: 内联表值 CREATE FUNCTION MyNS.GetUnshippedOrders() RETURNS TABLE AS RETURN SELECT a.SaleI ...
- Keil 函数内联 inline
内联函数是指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度,但是因为把内联函数拷贝了很多份,所 ...
- linux Rootkit:x86与ARM的内联内核函数Hooking
介绍 几个月前,我添加了一个新的项目.(https://github.com/mncoppola/suterusu) 通过我的各种对路由器后门及内核漏洞利用的探险,我最近的兴趣转向Li ...
- 使用C加加实现计算器功能。可以实现加减乘除。需要用到内联。函数重载。new运算符。缺省参数
inline int add(int a,int b) { return a + b ; } int add(int a,int b,int c,int d = 0) { return add(add ...
- 宏与内联(inline)的区别(转载)
先转载下人家总结的宏和普通函数调用的区别: (1).宏只做简单的字符串替换,函数是参数传递,所以必然有参数类型检查(支持各种类型,而不是只有字符串). (2).宏不经计算而直接替换参数,函数调用则是将 ...
最新文章
- pandas dataframe与series
- 深入理解Spark:核心思想与源码分析. 3.9 启动测量系统MetricsSystem
- mysql x64界面配置版下载_MySQL下载安装、配置与使用(win7x64)
- php redis 读写分离类,yii实现redis读写分离
- 我经常访问的技术网站
- 分享8个超棒的免费高质量图标搜索引擎
- 星露谷服务器一直没有空闲位置,星露谷物语小镇地图全npc住址位置 经验告诉你该这样...
- grub2配置原理分析
- SAP License:OAYZ中的使用年限无法更改
- P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)
- markdown如何修改为 微软雅黑 字体
- liunx中如何查看软件的安装目录
- 迅雷赚钱宝变砖TTL修复教程赚钱宝刷机
- mac如何查看ssd寿命_固态硬盘ssd写入量剩余读写次数怎么查
- 信息安全专业学习建议
- 高防服务器的机房硬件防火墙类型和主要功能
- 常用HTML转义字符
- 网站加入QQ在线即时交谈的代码
- Ubuntu18.04下NVIDIA驱动安装
- 【Unity】如何接入广告(技术及设计)
热门文章
- cefsharp 发送请求服务器_超高性能管线式HTTP请求(实践·原理·实现)
- python读取配置文件失败原因_python读取配置文件报keyerror-文件路径不正确导致的错误...
- 王者荣耀服务器维护啥时候结束,王者荣耀维护几点结束今天?11月10日维护公告...
- xp如何快速锁定计算机,Window XP中快速锁定计算机两法
- Cookie和会话Session
- 中统计字符串长度的函数_SQL Server中的字符串分割函数
- 百年理工计算机专业课程,这两所国内的百年理工院校,实力强劲,都是国内顶尖实力...
- Mysql Incorrect DATETIME value: ‘01/01/2021 00:00:00‘
- 面向 Web 前端的原生语言总结手册
- 【译】10个有趣的JSCSS库(2018.10)