//inline(内联)函数:将普通的函数定义为inline函数,可以避免普通函数入栈出栈的开销,它是将函数内的代码直接粘贴到调用处。除此之外,它和普通函数无异。

//要成为inline函数必须具备以下几点:

//1、函数代码很短,通过不超过10行

//2、函数内不能出现循环、递归、switch...case

//3、需要在编译的时候开启优化选项-O

//否则加上inline修饰,编译器也会视而不见

//强制inline宏

#define __inline__attribute__((always_inline))

//inline放置的位置只要在函数的返回值的类型前面就可,如果函数又有static修饰,放在static的前后都可

//inline在不同编译器下放置的位置导致的结果是不同的,某些编译器如果将inline放在函数的声明的前面是不被视为inline函数的,但大部分编译器对放在函数声明和函数定义的前面视为一样

内联函数与宏的区别在于:宏是由预处理器来对宏进行替代,没有语法检查、类型检查和安全检查;内联函数是通过编译器的控制来实现的,有语法检查、类型检查和安全检查;内联函数是真正的函数,而且在调用的地方,由编译器负责把内联函数的函数体代码块替换到内联函数被调用的地方,这一点与宏替换很相似;内联函数有参数,有返回值;由于内联函数可以像宏一样被展开,所以调用内联函数的时候,取消了函数参数压栈、出栈所带来的开销,从而减少了函数调用开销;这就是内联函数的优越于宏的地方;

内联函数的声明和内联函数的函数体的定义必须在一起;下面声明内联函数的语句是无效的:inline int Max(int a, int b);

而下面的内联函数的定义是有效的:

inline int Max(int a, int b){return ((a > b) ? a : b)};(c 语言声明)

C++类的成员函数也可以被定义为内联函数;比如:

class Student

{

private:

int nID

int nAge;

float fScore;

public:

void setID(int nid){ nID = nid; } //该成员函数默认自动为内联函数(隐式定义内联函数)

int getID(void){ return nID; } //该成员函数默认自动为内联函数(隐式定义内联函数)

inline void setAge(int nage) { nAge = nage; } //显式定义内联函数

inline int getAge(void) { return nAge; } //显式定义内联函数

void setScore(float fscore); //类定义体内没有声明为内联函数;

float getScore(void); //类定义体内没有声明为内联函数;

}

inline void Student::setScore(float fscore){ fScore = fscore; } //类定义体外实现为内联函数;

inline float Student::getScore(void) { return fScore; } //类定义体外实现为内联函数;

C++中,在类定义体内部定义了函数体的成员函数,被编译器默认为内联函数,而不管这个函数头前面是否有关键字inline,比如:setID()、getID()、setAge()、getAge();也可以把实现在类定义体外部的成员函数定义为内联函数,这个时候在类定义体中只有成员函数头的声明,而其实现是在类定义体外部,比如:setScore()和getScore();

即便是可以把实现在类定义体外部的成员函数定义为内联函数,那该成员函数的实现也必须写在声明类定义体的哪个头文件(.h)中,不能违反规则;即:内联函数的定义和实现都必须在同一个头(.h)文件中;

内联函数的局限性:

1、由于内联函数与宏一样也是实现为代码替换,所以定义为内联函数的函数体不宜过大,如果函数体过大,则某些普通的编译器就会放弃内联方式,而改用调用普通函数的方式,这样就失去了内联函数的意义了;所以,内联函数的函数体代码不宜过大,一般就是3---4行代码即可;

2、由于内联函数是编译器在便宜阶段进行函数体展开的,所以,这就把类的内联函数的定义与实现都必须在声明类的那个头文件中,而不能放在实现类的那个cpp文件中;

c语言inline不起作用,C语言inline内联函数学习小结相关推荐

  1. C语言中内联函数的作用 inline

    C语言中内联函数的作用 inline C语言中内联函数到底有什么作用? 试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子: 点击(此处)折 ...

  2. C++ 语言学习 day01 (linux ),基本输入输出错误输出函数,名字空间的含义,内联函数,缺省参数,引用 ,、new操作符

    1.介绍c++ C++头文件风格 c++ 老风格:以.h结尾 是c语言风格  stdio.h  (尽量不) c++的转换风格: 去掉.h 在文件名前加c 例如#include <cstdio&g ...

  3. inline 内联函数详解 内联函数与宏定义的区别

    一.在C&C++中 一.inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionName ...

  4. 内联函数inline的使用

    inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义 int g(int x)  {  return x + x;  }  int f()  {  return ...

  5. 内联函数inline

    结论在文章末尾处! 在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 内联函数的处理方式是在函数的调用点直接代码展开.在计算机系 ...

  6. 内联函数(Inline Function )

    目录 什么是内联函数(Inline Function) 如何将函数编写为内联函数(how to make function inline) 例: 为什么使用内联函数(Why to use inline ...

  7. c语言的应用与作用,C语言主要应用在什么地方?

    C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围 ...

  8. c语言什么是内联函数,C语言中内联函数inline的使用方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 来源一:比特网 来源二:东方锐智 在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵 ...

  9. c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨

    C语言里面的内联函数(inline)与宏定义(#define)探讨 先简明扼要,说下关键: 1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样 ...

最新文章

  1. 数据恢复软件extundelete介绍
  2. 独占电脑装linux,旧电脑如何处理?装Tiny Core,极致精简,超低CPU占用,你敢试吗...
  3. Codeforces987F AND Graph
  4. 计算机应用基础本科常见问题讨论,《计算机应用基础》(本科)2017年6月期末考试指导.pdf...
  5. Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据
  6. echarts 仪表盘 文字位置_方法 | 用notion打造个人仪表盘
  7. 前端数据库——WebSQL和IndexedDB
  8. 网络排障少走弯路两案例速解网管疑难
  9. 这款开源的中文字体,太惊艳了!
  10. 三菱plc可以用c语言编程吗,三菱PLC六种常用编程语言讲解
  11. matlab字符识别ocr,OCR字符识别 matlab
  12. 为什么hashmap的容量必须是2的n次幂
  13. QML state详解
  14. Linux centos7 代码运行时出现已放弃(吐核)的问题解决
  15. 笔记本电脑连接显示器如何让笔记本电脑单纯作为一台主机进行使用/笔记本连接显示器以后只需要显示器进行显示的操作! 2021/1/16
  16. Verifying 000xxxxx ( 0%) Verify failed between address 0xxxxxx and 0xxxxxx Leaving target processor
  17. Django连接Mysql报错:ModuleNotFoundError: No module named 'MySQLdb'
  18. 【新业务搭建】竞争情报业务规划及体系构建的思考——By Team
  19. PlantUML integration
  20. 手把手搭建springcloud微服务,使用Eureka

热门文章

  1. 记事本和textarea中的换行
  2. static class 静态类(Java)
  3. qt c语言socket,c – Qt双向客户端服务器使用QTcpSocket和QTcpServer
  4. 1010 一元多项式求导 (25分)
  5. php csv转excel 双引号,PHP高效导出Excel(CSV)
  6. Hive笔记之JOIN的左外链接和右外链接
  7. Leetcode143. Reorder List重排链表
  8. 创建好centos7虚拟机之后连xshell连不上虚机
  9. Java中TreeMap和TreeSet的底层实现
  10. Python format功能