1 inline内联函数

C++中的const常量可以替代宏常数定义,如:

const int A = 3;  #define A 3

C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!)

C++中推荐使用内联函数替代宏代码片段

C++中使用inline关键字声明内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

//宏替换和函数调用区别

#include "iostream"

using namespace std;

#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))

inline int myfunc(int a, int b)

{

return a < b ? a : b;

}

int main()

{

int a = 1;

int b = 3;

//int c = myfunc(++a, b);  //头疼系统

int c = MYFUNC(++a, b);

printf("a = %d\n", a);

printf("b = %d\n", b);

printf("c = %d\n", c);

system("pause");

return 0;

}

说明1:

必须inline int myfunc(int a, int b)和函数体的实现,写在一块

说明2

C++编译器可以将一个函数进行内联编译

被C++编译器内联编译的函数叫做内联函数

内联函数在最终生成的代码中是没有定义的

C++编译器直接将函数体插入在函数调用的地方 //内联函数和宏定义类似,是函数体的替换

内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

说明3:C++编译器不一定准许函数的内联请求!

说明4

内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)

内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求

内联函数由 编译器处理,直接将编译后的函数体插入调用的地方

宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程

说明5:

现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译

另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联

如:g++中的__attribute__((always_inline))属性

说明6:

C++中内联编译的限制:

不能存在任何形式的循环语句

不能存在过多的条件判断语句

函数体不能过于庞大

不能对函数进行取址操作

函数内联声明必须在调用语句之前

编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。

因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。

结论:
1)内联函数在编译时直接将函数体插入函数调用的地方

2)inline只是一种请求,编译器不一定允许这种请求

3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

c++——inline内联函数的更多相关文章

  1. [C++] inline内联函数使用方法

    C++支持内联函数,目的是为了提高函数的执行效率,类似于C语言中的宏定义 内联函数在调用时将它在程序中的每个调用点展开,不用额外分配栈空间 内联函数的定义在一个源文件中出现一次,但在多个源文件中可以同 ...

  2. CG_INLINE,inline 内联函数

    内联函数,即在编译的时候将函数体替换函数调用,从而不需要将parameter,return address进行push/pop stack的操作,从而加速app的运行,然而,会增加二进制文件的大小. ...

  3. (inline)内联函数在IOS开发中的使用

    今天在阅读YYKit源码(https://github.com/ibireme/YYKit.git)时发现在YYKitMacro.h组件中大量使用的内联函数,例如此文件中的一个函数 static in ...

  4. inline内联函数

    demo //带参数的宏 #define MYFUNC(a, b) ((a) < (b) ? (a) : (b)) inline int myfunc(int a, int b) { retur ...

  5. C++ inline内联函数

    inline 函数避免函数调用的开销 // find longer of two strings const string &shorterString(const string &s ...

  6. 《C++ Primer》笔记-inline内联函数

    inline 函数避免函数调用的开销 // find longer of two strings const string &shorterString(const string &s ...

  7. C++语言基础(7)-inline内联函数

    函数调用是有时间和空间开销的.程序在执行一个函数之前需要做一些准备工作,要将实参.局部变量.返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码:函数体中的代码执行完毕后还要清理现场,将之前压 ...

  8. C++对C语言的拓展(2)—— inline内联函数

    C语言中有宏函数的概念.宏函数的特点是内嵌到调用代码中去,避免了函数调用 的开销.但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错. 1.内联函数基本概念 C++提供了 in ...

  9. inline 内联函数

    1.目的: 引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数的引入可以减少程序的目标代码,实现程序代码和数据的共享.但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转 ...

随机推荐

  1. linux 用vi命令的使用以及vi编辑后的后续保存退出等相关命令的使用

    一.首先用vi命令打卡要编辑的文件: 注意:vi命令的使用如下 打开或新建文件,并将光标至于第一行首:[root@centos6 /]# vi /etc/my.cnf 打开文件,并将光标移至最后一行行 ...

  2. javascript之for循环的几种写法

    背景 javascript中的for循环选择多种多样,可你知道其中的差别在哪里吗?什么时候又该用哪种循环才是最佳策略?以上这些是本文想讨论的,欢迎交流. 说明 1.20年前的for循环 //20年前的 ...

  3. html基础-标题标签-文字标签(2)

    昨天说道了我的第一个网页,今天接着继续带大家深入,前期学习千万不要用代码工具哦!那样就少了深入了解的机会了哦! 一.大家都知道文章会有各种标题,网页其实也跟文章差不多也有专门来写标题的元素. (1). ...

  4. opencv图像处理时使用stringstream批量读取图片,处理后并保存

    简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...

  5. Android 蓝牙开发之搜索、配对、连接、通信大全

            蓝牙( Bluetooth®):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据 交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙设备最 ...

  6. ArcGIS Google Map 增加虚拟图层(MapImageLayer)(转载)

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  7. Flutter TabBar

    先看一下Tab的构造方法: TabBar({ Key key, @required this.tabs, this.controller, this.isScrollable: false, this ...

  8. 通过html导出PDF如何分页

    每页一个DIV,加上样式page-break-inside:avoid; 即可分页了 .pdfpage{page-break-inside:avoid;} <div class="pd ...

  9. 如何忽略.gitignore文件的提交

    1.默认的.gitignore文件无法忽略,如果想要忽略可以把.gitignore里面的文件转移到项目下面的 .git/info/exclude 里面, 2..gitignore可以直接使用插件,参照 ...

  10. ssm单项目整合

    目录 前言 创建maven项目 添加依赖 配置文件 总览 jdbc配置 mybatis配置 dao层配置 service层配置 事务配置 controller配置 web.xml 使用 前言 spri ...