【内联函数】

这篇具有很好参考价值的文章主要介绍了【内联函数】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内联函数

内联函数也称内嵌函数,它主要是解决程序的运行效率。
函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作都需要一些时间开销。有些函数使用频率高,但代码却很短。

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

一、指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字

请看下面的例子:

#include <iostream>
using namespace std;

//内联函数,交换两个数的值
inline void swap(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main(){
    int m, n;
    cin>>m>>n;
    cout<<m<<", "<<n<<endl;
    swap(&m, &n);
    cout<<m<<", "<<n<<endl;

    return 0;
}

注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。

一般是将非常短小的函数声明为内联函数

  • 内联函数中不能含有复杂的结构控制语句,如switch和while。如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码。
  • 另外,递归函数(自己调用自己的函数)是不能被用来做内联函数
    的。
  • 内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大
    函数,函数调用和返回的开销占比相对来说微不足道,所以也没有必要用内联函数实现

当函数比较复杂时,函数调用的时空开销可以忽略,大部分的 CPU 时间都会花费在执行函数体代码上,所以我们一般是将非常短小的函数声明为内联函数。

由于内联函数比较短小,我们通常的做法是省略函数原型,将整个函数定义(包括函数头和函数体)放在本应该提供函数原型的地方

内联函数不应该有声明,应该将函数定义放在本应该出现函数声明的地方,这是一种良好的编程风格。

下面的例子是一个反面教材,这样的写法是不被推荐的:

#include <iostream>
using namespace std;

//声明内联函数
void swap1(int *a, int *b);  //也可以添加inline,但编译器会忽略

int main(){
    int m, n;
    cin>>m>>n;
    cout<<m<<", "<<n<<endl;
    swap1(&m, &n);
    cout<<m<<", "<<n<<endl;

    return 0;
}

//定义内联函数
inline void swap1(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

使用内联函数的缺点也是非常明显的,编译后的程序会存在多份相同的函数拷贝如果被声明为内联函数的函数体非常大,那么编译后的程序体积也将会变得很大,所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数

内联函数与宏定义

1、宏

  • 宏的优点:宏函数在预处理阶段展开了,减少了函数调用的开销(传参,参数压栈以及栈帧花销)…

  • 宏的缺点:宏函数可能会存在一定的副作用;在预处理阶段进行替换,不会参与编译,少了类型检测;宏函数不能调试…

  • 在C++中,宏常量可以用const修饰的常量来代替,宏函数可以用内联函数来代替

宏函数的麻烦:
【内联函数】,c++
【内联函数】,c++
用内联函数替代
【内联函数】,c++

例题

【内联函数】,c++

    1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.
    1. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.
    1. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
    1. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
    1. 函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.

内联函数与宏的区别:

1.内联函数在运行时可调试,而宏定义不可以;

2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.在类中声明同时定义的成员函数,自动转化为内联函数。

作者:粉蒸肉
链接:https://www.nowcoder.com/exam/test/72102087/submission
来源:牛客网文章来源地址https://www.toymoban.com/news/detail-647717.html

到了这里,关于【内联函数】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 内联函数的出现

    在c++中,预定义宏的概念是用内联函数来实现的,而 内联函数本身也是一个真正的函数 。内联函数具有普通函数的所有行为。唯一不同之处在于它在编译时会被直接插入到调用它的地方,而不是像普通函数那样在运行时被调用。这样,内联函数可以避免函数调用的开销,提

    2024年02月19日
    浏览(6)
  • Kotlin 内联函数

    在JVM中每次函数调用,都会进行 操作栈 操作(栈帧),会增加内存使用和开销。 另外传入的 lambda 函数 参数,也会 内存分配(创建类和对象)。 inline 使用 内联 (inline) 可以避免上面的开销,通过把 函数的代码 直接插入 调用处, 而不是 调用函数 和 创建 lambda 函数类和

    2024年01月19日
    浏览(17)
  • 【C++入门】内联函数

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 内联函数概念: 内联函数就是以inline修饰的函数叫做内联函数,编译时会在调用内联函数的地方展开,没有函数调用占用建立栈帧的开销。 我们知道函数的

    2024年02月01日
    浏览(25)
  • 【C++】内联函数 ( 概念简介 )

    \\\" 内联函数 \\\" 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ; 在 C++ 中 , 定义常量 可以替换 C 语言中的 宏定义 使用 常量 可以 替代 宏定义 ; 宏定义分为两种 , 一种是 宏常数 , 另外一种是 宏代码片段 ; C++ 中使用 常量 替代 宏常数 ; C++ 中用于 替代 宏代码片

    2024年02月10日
    浏览(15)
  • 【C++初阶】:内联函数

    在c语言中,如果一个函数较短并且会被重复使用,那么我们就可以把该函数换成一个宏函数。 贴个小知识,宏函数有许多的坑也是面试官喜欢考的点,如果对行函数不太了解可以看看这篇关于宏的部分传送门 宏函数的优点:不会建立栈帧,提高使用效率。 宏函数的缺点:复

    2023年04月25日
    浏览(14)
  • 006-函数递归,内联,变参,声明

    函数嵌套: ​ 函数与函数之间相互进行调用; 递归函数: ​ 特殊的嵌套函数 ​ 特殊在递归函数是自己调用自己 ​ 即是函数A的函数体重又一次调用了函数A自己 ​ 函数A调用了函数B,函数B中又调用了函数A,两者属于递归吗? 属于递归 每一次调用函数,进行递归时,系统

    2024年02月15日
    浏览(28)
  • C++内联函数详解

    目录 如何定义内联函数? 内联函数的优势 内联函数的缺点 内联函数的使用场景 示例代码 总结 在C++中,内联函数是一种特殊的函数,它的作用是在程序编译时将函数的代码直接嵌入到调用该函数的代码中,从而避免了函数调用的开销。这种方式可以提高程序的执行效率,适

    2023年04月20日
    浏览(19)
  • 【C++内联函数】

    假设有这样的一个场景,有一个代码量不足三行的函数被调用了一万次,现在让你做优化,你会怎么考虑优化? 我们都知道函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能

    2023年04月26日
    浏览(56)
  • Inline内联函数简单理解

    How to Write it? example- 特点 编译器会将函数调用直接展开为函数体代码 人话: 直接将函数体里面的计算方法直接放到函数调用里,类似于宏替换。和#include 很像,但不相同。 编译后代码体量会变大。 用途 因为调用普通函数需要 开辟栈空间 ,调用完成后要 回收栈空间 如果是内

    2024年03月11日
    浏览(29)
  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包