inline的使用

  • 一.普通函数inline
    • 1.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。
    • 2.把内联函数的定义放在头文件中
  • 二.类的成员函数inline
    • 类的构造函数,析构函数的inline
  • 首先,明白一点:不是你指定函数inline就inline,关键看编译器是否认可。我们使用inline关键字指定inline函数仅仅是向编译器提的请求,编译器完全可以忽略这个请求
  • 其次,inline机制一般用于规模较小(可理解为行数少)、流程直接(可理解为没有for循环)、频繁调用的函数。

一.普通函数inline

1.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

如下面的函数Foo 不能成为内联函数[1]

inline void Foo(int x, int y); // 在函数声明前加inline,此时不能成为inline函数void Foo(int x, int y)
{}

而下面的函数Foo2 则成为内联函数:

inline void Foo2(int x, int y) // 在函数的定义处使用inline关键字,是inline函数
{}

所以说,inline 是一种 “用于实现的关键字” ,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

[1] : 参考: 内联函数 —— C 中关键字 inline 用法解析

2.把内联函数的定义放在头文件中

由于inline函数需要展开的缘故,所有调用inline函数的源文件必须包含inline函数的定义,因为仅仅有函数的声明无法做到函数的展开。这可以当成是inline函数和其他函数不同的一个地方:即inline函数可以多重定义。

为了避免一个inline函数在多个源文件(.cpp文件)中出现,我们应该把inline函数的定义放在一个头文件(.h文件)中,所有调用inline函数的源文件(.cpp文件)包含此头文件即可。
如:
在test_inline.h中定义一个inline函数:

#ifndef _TEST_INLINE_
#define _TEST_INLINE_#include <iostream>inline void print()
{std::cout << "我是inline函数" << std::endl;
}#endif

其他源文件包含test_inline.h即可。

二.类的成员函数inline

请看下面的一个类,摘抄至C++ Primer第5版:

//头文件Test_inline.h中
class Screen
{public:typedef std::string::size_type pos;Screen() = default;Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht*wd, c){}char get() const//1.在类内定义函数,默认为隐式inline函数{return contents[cursor];}inline char get(pos r, pos c) const;//2.在声明处,显式内联Screen& move(pos r, pos c);//3.成员函数可以在类外定义处内联private:pos cursor = 0;pos height = 0, width = 0;std::string contents;
};//2.在声明处,显式内联
char Screen::get(pos r, pos c) const
{pos row = r * width;return contents[row + c];
}//3.成员函数可以在类外定义处内联
inline Screen& Screen::move(pos r, pos c)
{pos row = r * width;cursor = row + c;return *this;
}

不难发现类的成员函数为inline的3种情形:

  1. 在类的内部直接定义函数,这是隐式的inline函数,如char get() const;
  2. 在类的声明处用inline关键字,这是显示化成员函数,如inline char get(pos r, pos c) const;
  3. 在类外部定义处用inline关键字,如inline Screen& Screen::move(pos r, pos c){}

  • 注意第2条和普通函数的内联的区别:类的成员函数声明可以成为内联函数。
  • 此外,在定义和声明处都写上inline关键也是可以的,不过最好还是在定义处说明inline,就像上述第 3条一样。
  • 成员函数inline的定义也要和类的定义放在同一头文件中,原因和普通函数inline一样。

类的构造函数,析构函数的inline

看C++编程思想上的一个实例:

在类withMembers里,内联的构造函数和析构函数看起来似乎很直接和简单,但其实很复杂,因为成员对象Q、P和S的构造函数和析构函数被自动调用。

[2]所以说,表面上类的构造函数和析构函数使用内联更有效。实际上,要当心构造函数和析构函数可能会隐藏一些行为:“偷偷地”执行了基类或成员对象的构造函数和析构函数,所以不要随便地将构造函数和析构函数的定义体放在类声明中

[2]:参考:[https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html](https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html)

以上就是全部的内容,如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。若是喜欢本文,就帮忙点赞吧!

C++之inline的使用相关推荐

  1. Python关于%matplotlib inline

    我在做一个比赛需要使用到LSTM模型对时间序列进行预测,然后在github代码中经常会看到这样的代码: import numpy import matplotlib.pyplot as plt fro ...

  2. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载

    嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理​ ...

  3. 内联函数inline

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

  4. c语言inline详解

    本文介绍了GCC和C99标准中inline使用上的不同之处.inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而 ...

  5. c语言头文件中定义inline static相关函数的优劣

    头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一.于是自己验证.经过arm-none-eabi-gcc下测试后得出结论. in ...

  6. C/C++中inline/static inline/extern inline的区别及使用

    引入内联函数的目的是为了解决程序中函数调用的效率问题,也是用内联函数取代带参宏定义(函数传参比宏更加方便易用) inline关键字用来定义一个类的内联函数. 在类体中和类体外定义成员函数是有区别的:在 ...

  7. display的block、none、inline属性及解释

    常会用到display对应值有block.none.inline这三个值 参数: block :块对象的默认值.用该值为对象之后添加新行.之前也添加一行. none :隐藏对象.与visibility ...

  8. 演示:思科IPS在线模式下Inline Interface Mode的响应行为(区别各个防御行为)

    演示:思科IPS在线模式下Inline Interface Mode的响应行为 演示目标:科IPS在线模式下InlineInterface Mode的响应行为. 演示环境:仍然使用图5.16所示的网络 ...

  9. %matplotlib inline的含义

    %matplotlib inline的含义 %matplotlib inline 用在Jupyter notebook中(代替plt.show()): PyCharm中不支持,在PyCharm中去掉这 ...

  10. C++ 中 inline 用法概述

    在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数. 引入 inline 关键字的原因 在 c/c++ 中,为了解决一些 ...

最新文章

  1. 用c语言编写黎曼积分计算pi,C语言实现黎曼和求定积分
  2. (boost::mp11::mp_rotate_left相关用法的测试程序
  3. 微软发布 VS Code Java 安装程序,一键安装所有 Java 开发环境
  4. matlab guide 自定义右键菜单
  5. Linux Shell脚本入门教程系列之(三)Shell变量
  6. pthread_mutex_init 互斥锁pthread_mutex_t的使用(转)
  7. Android进阶(三) 数据存储之SharedPreference
  8. aardio - 【库】虚表增强版
  9. 上位机和下位机的概念
  10. html5在线+网站,15个在线HTML5网页设计工具
  11. Oracle数据库的备份方式
  12. webservice 教程学习系列(八)——wsdl文档深入分析
  13. ARM920T的MMU
  14. mac mini 蓝牙_Mac Mini
  15. 全网M1、MAC傻瓜式免费安装xmind
  16. xampp 可道云_Windows下用kodexplorer可道云在本地搭建私有云的步骤
  17. 谷歌cloud_参加Google Cloud专业机器学习工程师考试的20天Beta
  18. jmeter接口自动化,你敢想,我敢玩
  19. 我的世界联机教程java_我的世界(minecraft)联机教程
  20. 简单验证 姓名,身份证,手机号码

热门文章

  1. 源码圈内推信息整理(2018-03-03)
  2. 使用CSS3滤镜让图片反转颜色
  3. 计算机专业的当老师选语文还是英语,当老师选什么考研专业
  4. 周鸿祎:把自己当成打工的,一辈子都是打工的!
  5. Android EditText取消焦点并关闭输入法
  6. Banner无限图片轮播
  7. C++:设计一个虚基类Person
  8. 解决“scanf返回值被忽略”一劳永逸的方法
  9. 谁知道Windows 7里面怎么设置 /PAE /3GB?
  10. DA-PEG-DA MW:2000 DA-PEG2000-DA 双丙烯酸酯聚乙二醇