C++简明分析inline函数的使用
目录
- inline函数
- 实例
- 要点
- 建议
inline函数
当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,
这些工作需要系统时间和空间的开销。
请看如下程序段,读入一行字符串,逐个判断是否为数字字符:
#include<iostream> using namespace std; bool IsNumber(char ch) { return ch>= ʹ0ʹ && ch <= ʹ9ʹ ? 1 : 0; } int main() { char ch; while(cin.get(ch), ch!= ʹ nʹ) { if (IsNumber(ch)) { cout<<′′是数字字符 ′′<<endl; } else { cout<<′′不是数字字符 ′′<<endl; } } return 0; }
当函数功能简单,使用频率很高,为了提高效率,直接将函数的代码嵌入到程序中。但这个办法有缺点,一是相同代码重复书写,二是程序可读性往往没有使用函数的好。
为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函
数时用修饰词inline
inline bool IsNumber(char ch) { return ch>='0'&&ch<='9'?1:0; }
加inline关键字将其改成内联函数,在编译期间编译器能够在调用点内联展开该函数。
实例
在debug模式下,设置编译器。
要点
inline是一种以空间换时间的做法,省去调用函数额开销。但当函数体的代码过长或者是递归函数即便加上inline关键字,也不会在调用点以内联展开该函数。
inline对于编译器而言只是一个建议,编译器会自动优化。
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
建议
如果函数的执行开销小于开栈清栈开销(函数体较小 ),使用inline处理效率高。如果函数的执行开
销大于开栈清栈开销,使用普通函数方式处理。
到此这篇关于C++简明分析inline函数的使用的文章就介绍到这了,更多相关C++ inline函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++ inline内联函数详解
函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码.CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码:被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行. 一个 C/C++ 程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main().当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生
-
C++中inline用法案例详解
1 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数,栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间.在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭. 下面我们来看一个例子: #include <stdio.h> #include<string.h> // 函数定义为in
-
C++ 内联函数inline案例详解
使用函数能够避免将相同代码重写多次的麻烦,还能减少可执行程序的体积,但也会带来程序运行时间上的开销. 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,最后才跳转到函数内部执行.这个过程是要耗费时间的. 另外,函数执行 return 语句返回时,需要从栈中回收形参和局部变量占用的存储空间,然后从栈中取出返回地址,再跳转到该地址继续执行,这个过程也要耗费时间. 总之,
-
详解C++中的inline用法
1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭. 下面我们来看一个例子: #include <stdio.h> //函数定义为inline即:内联函数 inline char*
-
详解C++中inline关键字的作用
目录 inline关键字: 目的: 原理: 注意事项: 总结 inline关键字: 目的: 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题. 原理: 调用函数的时候直接把函数的代码拿过来复用,不用一直压栈和出栈. 注意事项: 类中的函数默认是内联的,但是如果类的定义是在类外实现的,此时就不是内联的,如需要添加内联,需要在函数定义前加上inline关键字.inline必须放在函数定义前面,放在声明前面不可以慎用inline,因为这个方法是用代码量替换栈空间. 总结
-
C++知识点之inline函数、回调函数和普通函数
目录 一.inline内联函数# 1.1 使用# 1.2 编译器对 inline 函数处理步骤# 1.3 优缺点# 1.3.1 优点# 1.3.2 慎用内联# 1.3.3 不宜使用内联# 1.4 虚函数(virtual)可以是内联函数(inline)吗?# 二.回调函数和普通函数# 2.1 什么是回调函数?# 2.2 为什么要使用回调函数?# 回调函数和普通函数有什么区别? 总结 一.inline内联函数# 特征 相当于把内联函数里面的内容写在调用内联函数处: 相当于不用执行进入函数的步骤,直接
-
c++中的内联函数inline用法实例
问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的.内联函数的inline要加在函数前面,不可以加在声明前面. class A { public:void Foo(int x, int y) { } // 自动地成为内联函数 } //正确写法: // 头文件 class A { public: void Foo(int x, int y); } // 定义文
-
C++深入探索内联函数inline与auto关键字的使用
目录 1.内敛函数 1.1问题引入 1.2内联函数的概念 1.3内敛函数的特性 2.auto关键字 2.1 auto简介 2.2 auto的使用细则 2.3 auto不能推导的场景 2.4 auto与新式for循环使用 1.内敛函数 1.1问题引入 我们在使用C语言中我们都学过函数,我们知道函数在调用的过程中需要开辟栈帧.如果我们需要频繁的调用一个函数,假设我们调用10次Add()函数,那我们就需要建立10次栈帧.我们都知道在栈帧中要做很多事情,例如保存寄存器,压参数,压返回值等等,这个过程是很
-
C++inline函数的特性你了解吗
目录 一.inline的作用(内联函数) 二.inline的实现(注意debug模式下内联函数不会展开) 三.使用inline的注意事项 四.inline和预处理的区别 总结 一.inline的作用(内联函数) 我们使用关键字inline和函数定义一起就可以创建一个内联函数,它的作用就是减少函数调用的开销,假如我们的程序中有一个函数会频繁的被调用,这样使程序的运行速度十分缓慢,那么我们使用内联函数,就可以解决这种问题,提高程序的运行效率. 内联函数的定义: inline void add(int
-
C++简明分析inline函数的使用
目录 inline函数 实例 要点 建议 inline函数 当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等, 这些工作需要系统时间和空间的开销. 请看如下程序段,读入一行字符串,逐个判断是否为数字字符: #include<iostream> using namespace std; bool IsNumber(char ch) { return ch>= ʹ0ʹ && ch <= ʹ9ʹ ? 1 : 0; } int main(
-
C++简明分析讲解引用与函数提高及重载
目录 详解引用 引用的基本使用 引用做函数参数 引用做函数返回值 常量引用 引用的本质 函数提高 函数默认值 函数占位参数 函数重载及注意事项 详解引用 引用的基本使用 语法:数据类型 &新变量名 =原来变量名 作用:给变量起别名 注意事项: 1.引用必须初始化 2.一旦初始化就不能更改(具体原因在下面引用本质上会讲到) 示例: int a = 10; int c = 20; 如果写 int &b;这是错误的,没有初始化引用,编译器不知道b指向的地址. 所以这样写 int &b=a
-
C++简明分析临时对象是什么
目录 一.初探临时对象 1.问题 2.思考 3.答案 二.编译器的行为 三.小结 一.初探临时对象 1.问题 下面的程序输出什么?为什么? 下面编写程序进行实验: #include <stdio.h> class Test { int mi; public: Test(int i) { mi = i; } Test() { Test(0); } void print() { printf("mi = %d\n", mi); } }; int main() { Test t;
-
C++中inline函数详解
本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题: 一.C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题. C语言中的宏定义:#define ExpressionName(var1,var2) (var1+var2)*(var1-var2)这种宏定义,它使用预处理器实现,没有了参数压栈.代码生成等一系列得到操作,因此效率很高.但缺点如下: 仅仅是做预处理器符号表中的简单替换,因此不能进行参数有效性的检测
-
C++简明分析讲解布尔类型及引用
目录 一.C++中的布尔类型 二.C++中的三目运算符 三.C++中的引用 四.总结 一.C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和 false 理论上bool只占用一个字节 C++编译器会将非0值转换为true ,0值转换为false 注意: true代表真值,编译器内部用1来表示 false代表非真值,编译器内部用0来表示 下面看一下这段代码,加深一下对bool类型的理解. #include <stdio.h> int ma
-
C语言简明分析选择结构和循环结构的使用
目录 一.程序中的选择结构(if) 二.switch多分支选择语句 三.while循环结构 四.do...while 与 for 五.break和continue 一.程序中的选择结构(if) if的用法 上代码: #include <stdio.h> int main() { short a = 1; short b = 2; int c = a - b; if( c > 0 ) { printf("a > b\n"); } else { printf(&qu
-
C++详细分析讲解函数参数的扩展
目录 一.函数参数的默认值 二.函数占位参数 三.小结 一.函数参数的默认值 C++ 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的默认值必须在函数声明中指定 下面看一段代码: #include <stdio.h> int mul(int x = 0); int main(int argc, char *argv[]) { printf("%d\n", mul()); printf("%d\n", mul(-1
-
C语言简明分析指针与引用的具体用法
目录 1.指针 2.引用 1.指针 在计算机中,数据是存放在内存单元中的,一般把内存中的一个字节称为一个内存单元.为了更方便地访问这些内存单元,可预先给内存中的所有内存单元进行地址编号,根据地址编号,可准确找到其对应的内存单元.由于每一个地址编号均对应一个内存单元,因此可以形象地说一个地址编号就指向一个内存单元.C 语言中把地址形象地称作指针. 主要就是两个运算符:&和*. & 表示求地址,*表示求地址中的值,*也可以用来定义指针(int *p表示整型指针): int a=1; int *
-
Python简明讲解filter函数的用法
目录 一.filter函数的定义 二.filter函数实例 求一个序列中大于零的元素组成的新序列 求序列中非零数组成的新序列 求字典中大于2的键组成的新序列 求100以内既是3的倍数又是奇数的正整数 任何事情都是由量变到质变的过程,学习Python也不例外.只有把一个语言中的常用函数了如指掌了,才能在处理问题的过程中得心应手,快速地找到最优方案. 一.filter函数的定义 filter函数是Python中常用的内置函数,调用无需加载库,直接使用即可.它主要用来根据特定条件过滤迭代器中不符合条件
随机推荐
- 瀑布流布局代码一例
- Jquery中对数组的操作代码
- javascript实现label标签跳出循环操作
- 关于vue.js弹窗组件的知识点总结
- Swift 共享文件操作小结(iOS 8 +)
- Oracle数据库安全策略
- Swift中的条件切换语句switch...case学习教程
- 为什么JavaScript没有块级作用域
- Bootstrap选项卡与Masonry插件的完美结合
- 如何解决vue与传统jquery插件冲突
- php使用fopen创建utf8编码文件的方法
- spl_autoload_register与autoload的区别详解
- PHP 生成微信红包代码简单
- 自定义刻度jQuery进度条及插件
- sql不常用函数总结以及事务,增加,删除触发器
- JavaScript CSS 通用循环滚动条
- 浅谈Java中复制数组的方式
- 图文详解Linux服务器搭建JDK环境
- java连接Access数据库的方法
- RecyclerView底部分割线去除的方法