当前位置: 首页 > news >正文

C++内联函数

调用函数时需要一定的时间和空间的开销。C++提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(inline function),又称内嵌函数或内置函数。

指定内联函数的方法很简单,只需要在定义函数时增加 inline 关键字。

注意:是在函数定义时增加 inline 关键字,而不是在函数声明时。在函数声明时增加 inline 关键虽然没有错误,但是也没有任何效果

inline 关键字放在函数声明处不会起作用:

 

inline 关键字应该与函数体放在一起:

 

void swap(int&a,int&b);
inline void swap(int&a,int&b)
{
int temp = a;
    a = b;
    b = temp;
}

 

  采用内联函数可以有效避免函数调用的开销,程序执行效率更高。使用内联函数的缺点就是,如果被声明为内联函数的函数体非常大,则编译器编译后程序的可执行码将会变得很大。

 

  另外,如果函数体内出现循环或者其它复杂的控制结构的时候,这个时候处理这些复杂控制结构所花费的时间远大于函数调用所花的时间,因此如果将这类函数声明为内联函数意义不大,反而会使得编译后可执行代码变长。

 

  通常在程序设计过程中,我们会将一些频繁被调用的短小函数声明为内联函数。

 

  应当说明:对函数作inline声明,只是程序员对编译系统提出的一个建议,也就是说它是建议性的,而不是指令性的。并非一经指定为inline,编译系统就必须这样做。编译系统会根据具体情况决定是否这样做。

一个完整的示例:

#include<iostream>
usingnamespace std;
int max(int,int,int);//函数声明,左端也可以加inline

int main()
{
	int i=10, j=20, k=30, m;
	m =max(i, j, k);
	cout<<"max="<<m<<endl;
	return0;
}
inline int max(int a,int b,int c)//定义max为内联函数
{
	if(b>a) a=b;
	if(c>a) a=c;
	return a;
}

  

运行结果:
max=30

由于在定义函数时指定它为内置函数,因此编译系统在遇到函数调用“max(i, j, k)”时,就用max函数体的代码代替“max(i,j, k)”,同时将实参代替形参。这样,程序第6行 “m=max(i, j, k);”就被置换成:

if (j>i) i=j;
if(k>i) i=k;
m=i;

  

 

转载于:https://www.cnblogs.com/Burgess-Fan/p/7050079.html

相关文章:

  • 收缩数据文件
  • Flask 扩展 表单
  • openfalcon-0.2 配置
  • elasticsearch从入门到出门-08-Elasticsearch容错机制:master选举,replica容错,数据恢复...
  • [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面
  • border:none;和border:0;的区别
  • win server2012 r2 服务器共享文件夹设置
  • 页头开发
  • mysql主从同步(5.1版本)
  • 51nod 1421 最大MOD值
  • R语言-排序
  • idea 15安装步骤2017.6.25
  • 机器学习:绪论
  • JS(一)
  • spring data jpa mysql 悲观锁
  • 网络传输文件的问题
  • JavaScript 如何正确处理 Unicode 编码问题!
  • @jsonView过滤属性
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android 架构优化~MVP 架构改造
  • Angular 2 DI - IoC DI - 1
  • go语言学习初探(一)
  • Js基础知识(一) - 变量
  • Mysql5.6主从复制
  • NSTimer学习笔记
  • 多线程 start 和 run 方法到底有什么区别?
  • 技术:超级实用的电脑小技巧
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 我的面试准备过程--容器(更新中)
  • 主流的CSS水平和垂直居中技术大全
  • 做一名精致的JavaScripter 01:JavaScript简介
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​linux启动进程的方式
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (笔试题)合法字符串
  • (待修改)PyG安装步骤
  • (动态规划)5. 最长回文子串 java解决
  • (二)linux使用docker容器运行mysql
  • (二)springcloud实战之config配置中心
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *上位机的定义
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net经典笔试题
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net专家(张羿专栏)
  • .py文件应该怎样打开?
  • /etc/fstab和/etc/mtab的区别