IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【内联函数 学习日记】 -> 正文阅读

[C++知识库]【内联函数 学习日记】

一、定义

C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。

二、内联函数和一般函数的区别

  1. 内联函数比一般函数在前面多了一个inline关键字修饰符
  2. 内联函数是直接复制函数内容,镶嵌到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同。主函数在调用一般函数的时候,是指令跳转到被掉函数的入口地址,执行完被调用的一般函数后,指令再跳转回主函数上继续执行后面的代码;而内联函数是直接将函数的代码直接放在了调用的位置上,所以没有指令跳转,而是按顺序执行。
  3. 一般函数的代码段只有一份,放在内存的某个位置上,当程序调用它时,指令就跳转过来,执行完再跳转回去;当程序下一次调用它时,指令又跳转过来;而内联函数则是程序中调用几次它,就将内联函数的代码复制几份放在对应的位置上。
  4. 内联函数一般在头文件中定义,而一般函数在头文件中声明,在cpp文件中定义。 例如:getXXX{return m_XXX;};//这种写法默认就是内联的

三、利弊

  1. 利:避免了指令的来回跳转,加快程序的执行速度
  2. 弊:代码被多次复制,增加了代码量,占用更多内存空间

四、使用内联的时机

  1. 函数本身内容较少,代码较短,功能简单
  2. 函数被频繁调用,比如循环中的函数

五、不能建议使用内联函数的情况

  1. 函数代码量多,功能复杂,体积庞大。对于这样的函数,即使使用inline修饰,编译器也不一定响应,可能还是当成一般函数调用。
  2. 递归函数不能使用内联修饰

六、内联函数和宏

#include <iostream>
using namespace std;
 
#define SUM(x) x*x
 
inline int fun(int x)
{
	return x * x;
}
 
int main()
{
	int a = SUM(2 + 3);
	int b = fun(2 + 3);
 
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
 
	system("pause");
	return 0;
}

输出 a= 11;b=25
是因为宏只是机械简单的将入参传入再执行,相当于2+3*2+3,所以得到11。应将宏优化为

#define SUM(x)((x)*(x))

再C++程序中应避免使用宏,可以用内联函数代替。

七、内联函数与类

  1. 类内定义的函数都是内联函数,不管是否有inline修饰符,有必要时建议将小片段的内联函数定义在类内。
  2. 函数声明在类内,但定义在类外的看是否有inline修饰符,如果有就是内联函数,否则不是。
  3. 当把类内函数置为内联函数时,注意在头文件声明,源文件定义时,只有定义内联函数的源文件可以用它,其他文件调用会报错:“找不到函数定义”,见下:
    inline.h
class inline_{
public:
   inline_(int a_, int b_);
   int max();  //只声明,不定义。则只要不调用这个函数就不会报错;
               //调用了这个只声明未定义的函数的话,编译的时候就会报错
               //因为只有调用的时候,才会产生调用函数的代码
               //至于函数的实现在哪里,那不是编译器要考虑的事,
               //当调用时链接器才需要查找函数的实现代码并与函数调用代码对上
private:
   int a ;
   int b ;
};

inline.cpp

#include "inline.h"

inline_::inline_(int a_, int b_) : a(a_), b(b_)
{

}

inline int inline_::max()
{
   return a > b ? a : b;
}

main.cpp

int main()
{
    cout << "Hello World!" << endl;
    inline_ inline__(3, 2);
    std::cout << inline__.max();
    return 0;
}

报错:在这里插入图片描述
所以需要,在使用内联函数的文件中再进行一次定义:

#include <iostream>
#include "inline.h"
using namespace std;

inline int inline_::max()
{
    int nb;
    return a > b ? b : a;
}

int main()
{
    cout << "Hello World!" << endl;
    inline_ inline__(3, 2);
    std::cout << inline__.max();
    return 0;
}

注意需要保证,在不同文件中对于同一内联函数的定义保持一致,避免歧义。不保持一致也能通过编译,但是会导致程序出现歧义,要注意。

参考链接:
https://blog.csdn.net/cppwork/article/details/18662617?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164998556616780269833202%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164998556616780269833202&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-4-18662617.142v8pc_search_result_control_group,157v4control&utm_term=%E5%86%85%E8%BF%9E%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187
https://blog.csdn.net/qq_33757398/article/details/81390151

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:22:53  更:2022-04-18 17:27:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:05:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码