[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 ...
随机推荐
- 【开发工具】- Myeclipse10.7破解方法
1.下载myeclipse 10,如果没有,可以使用链接:https://pan.baidu.com/s/1l9juqD4ALMuepVL6e5kgjA 密码:kpx6:当然时间久了可能链接失效,如有 ...
- html解决空格显示问题
在前端里面,大家都知道,html中输入空格或换行是识别不了是空格的,但是有时候需要实现,那么该如何解决呢?主要有以下几个方面: 1:常用的转义: 2:使用全角拼音,然后输入空格也可实现 3:用标签 ...
- TypeScript编写Vue项目结构解析
使用TypeScript编写Vue项目也已经有了一段时间,笔者在刚刚使用TypeScript时候也是很茫然,不知道从何下手,感觉使用TypeScript写项目感觉很累赘并不像JavaScript那么灵 ...
- swiper-动态更改数据后轮播点击或拖动失效
出现的问题: 1.swiper不能自动切换(设置了autoplay). 2.数据不匹配(需要加载的数据以改变,但是swiper里面的数据出现错误). 3.数据匹配过后,永远切换不到第一条数据. 4.根 ...
- Docker04-镜像
目录 镜像介绍 获取镜像 案例:获取 redis 5.0.0的镜像 查询本地镜像 搜索镜像 删除镜像 案例:删除redis:latest镜像 镜像加速 镜像介绍 镜像是Docker的三大核心概念之一. ...
- 【HCIA Gauss】学习汇总-数据库管理(SQL语法 数据类型 函数)-4
DDL data definition language 数据库定义语言 定义修改等DML data manipulation language 数据库操控语言 增删改 DCL data crontr ...
- 21.centos7基础学习与积累-007-远程连接
从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 IP地址: 互联网上的计算机 都会有一个唯一的32位的地址,ip地址,我们访问服务器 ...
- python assert 在正式产品里禁用的手法 直接-O即可
How do I disable assertions in Python? There are multiple approaches that affect a single process, t ...
- 正式一点的my.cnf文件
感觉比以前的文件,配置正式了一些. 留照. [client] port #socket=/mysql/mysql.sock default-character-set=utf8 [mysqld] po ...
- python爬虫中涉及json数据的处理
在执行爬虫项目的过程中,有时返回的不是一个html页面而是json格式数据,此时对数据的解析非常重要. 1.Json格式数据的爬取 采用request对以上的url进行爬取: import re ...