C++从入门到精通——内联函数

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


前言

内联函数是一种优化手段,通过在编译时将函数调用替换为函数体本身的复制品,以减少函数调用的开销。它适用于函数体较小、调用频繁的情况。使用内联函数可以提高程序执行效率,但也会增加最终生成的代码大小。在C++中,可以使用inline关键字声明内联函数。然而,编译器对于是否真正内联一个函数有最终决定权,即使函数被声明为内联,编译器也可以选择不进行内联。


一、内联函数概念

为什么会出现内联函数

C语言使用宏定义编写两数交换

引例:C语言可以使用宏定义实现两数交换的功能。下面是一个示例的代码:

#include <stdio.h>

#define SWAP(a, b)  do { \
                        int temp = a; \
                        a = b; \
                        b = temp; \
                    } while (0)

int main() {
    int num1 = 10;
    int num2 = 20;

    printf("Before swap: num1 = %d, num2 = %d\n", num1, num2);

    SWAP(num1, num2);

    printf("After swap: num1 = %d, num2 = %d\n", num1, num2);

    return 0;
}

这段代码中定义了一个宏 SWAP,使用 do-while 循环实现交换。在 main 函数中声明了两个变量 num1num2,然后调用 SWAP 宏进行交换,最后打印结果。运行程序,输出如下:

Before swap: num1 = 10, num2 = 20
After swap: num1 = 20, num2 = 10

C++中引入了内联函数的概念,主要是为了提高程序的性能。在C语言中没有内联函数的概念,我们通常会使用宏定义来实现,但是宏定义的写法过于困难,如上所示的宏定义实现的交换,所以便在C++中便提出内联函数这个概念,来替代宏定义写的函数。

内联函数的作用是在编译时将函数的代码嵌入调用的地方,而不是通过函数调用的方式执行。

内联函数的优点有以下几点:

  1. 减少函数调用的开销:函数调用会涉及到栈的操作、参数传递和返回值的处理等,而内联函数的代码直接嵌入到调用的地方,避免了这些开销。

  2. 减少函数调用带来的代码膨胀:函数调用会导致代码中出现大量的跳转指令,而内联函数的代码直接嵌入到调用的地方,可以减少跳转指令的数量,使代码更加紧凑。

  3. 提高缓存命中率:内联函数的代码嵌入到调用的地方,可以减少函数调用时的跳转,使得程序的指令更加连续,更有可能被CPU缓存命中,提高程序的执行效率。

需要注意的是,内联函数适用于函数体较小、频繁调用的情况。对于函数体过大或者调用频率较低的函数,使用内联可能会导致代码膨胀、降低缓存命中率,反而影响性能。因此,使用内联函数需要根据具体情况进行权衡和选择。

内联函数的概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
C++从入门到精通——内联函数,C++从入门到精通,c++,java,数据结构,开发语言,c语言,考研,visual studio
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

二、内联函数的查看方式

  1. release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)

C++从入门到精通——内联函数,C++从入门到精通,c++,java,数据结构,开发语言,c语言,考研,visual studio

C++从入门到精通——内联函数,C++从入门到精通,c++,java,数据结构,开发语言,c语言,考研,visual studio

三、内联函数的特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用
    • 缺陷:可能会使目标文件变大
    • 优势:少了调用开销,提高程序运行效率
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同
    • 一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
    • 下图为《C++prime》第五版关于inline的建议:
      C++从入门到精通——内联函数,C++从入门到精通,c++,java,数据结构,开发语言,c语言,考研,visual studio
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
 	cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
	 f(10);
	 return 0;
}
// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

对于这种情况,我们可以直接在头文件中直接定义文章来源地址https://www.toymoban.com/news/detail-846588.html

inline void f(int i)
{
 	cout << i << endl;
}

四、关于内联函数的题目

宏的优缺点

  • 优点:
    1.增强代码的复用性。
    2.提高性能。
  • 缺点:
    1.不方便调试宏。(因为预编译阶段进行了替换)
    2.导致代码可读性差,可维护性差,容易误用。
    3.没有类型安全的检查 。

C++有哪些技术替代宏

  1. 常量定义 换用const 或 enum
  2. 短小函数定义 换用内联函数

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

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

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

相关文章

  • 数据结构从入门到精通——队列

    队列是一种特殊的线性数据结构,遵循先入先出(FIFO)的原则。它只允许在队列的末尾添加元素(称为入队操作),并从队列的开头移除元素(称为出队操作)。队列在多种应用中发挥着重要作用,如计算机系统的任务调度、打印机作业管理以及多线程编程中的线程同步等。

    2024年03月13日
    浏览(60)
  • 数据结构从入门到精通——希尔排序

    希尔排序是一种基于插入排序的算法,通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。这种算法交换操作结合了直接插入排序和分组交换的思想,交换操作和移动操作相结合,相比于直接插入排序

    2024年03月21日
    浏览(48)
  • 数据结构从入门到精通——堆排序

    堆排序是一种利用堆数据结构实现的排序算法。首先,它将待排序的数组构建成一个大顶堆或小顶堆。然后,通过不断将堆顶元素(最大或最小)与末尾元素交换并重新调整堆,使得数组逐渐有序。最后,当堆的大小减至1时,排序完成。堆排序的时间复杂度为O(nlogn),空间复

    2024年04月09日
    浏览(50)
  • 数据结构从入门到精通——冒泡排序

    冒泡排序是一种简单的排序算法,通过重复遍历待排序数列,比较相邻元素的大小并交换位置,使得每一轮遍历后最大(或最小)的元素都会“冒泡”到数列的一端,直到整个数列有序。这种算法的时间复杂度较高,但在处理小规模数据或近乎有序的数据时表现良好,除此之

    2024年04月16日
    浏览(37)
  • 数据结构从入门到精通——直接插入排序

    直接插入排序是一种简单的排序算法,其工作原理是逐个将待排序元素插入到已排序序列中的适当位置,直到全部元素排序完毕。算法从第二个元素开始,将其与前面的元素进行比较,如果当前元素小于前一个元素,则将其插入到前一个元素之前,否则继续向前比较。重复此

    2024年03月21日
    浏览(50)
  • 数据结构从入门到精通——树和二叉树

    树和二叉树是计算机科学中常用的数据结构,它们在数据存储、搜索、排序等多个领域都有着广泛的应用。从简单的二叉树出发,我们可以逐步理解更复杂的树结构,如红黑树、AVL树等。 二叉树是一种每个节点最多有两个子节点的树结构,通常子节点被称为“左子节点”和“

    2024年03月15日
    浏览(101)
  • 【C++入门】内联函数

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

    2024年02月01日
    浏览(41)
  • 数据结构从入门到精通——排序的概念及运用

    排序是将数据按照一定规则重新排列的过程,常见规则有升序、降序等。排序算法如冒泡排序、快速排序等,广泛用于数据库、搜索引擎等场景,提高数据检索效率。此外,排序也应用于统计分析、机器学习等领域,以获取有序数据集或发现数据间的关联。 排序是一种将一组

    2024年03月21日
    浏览(40)
  • 『C++成长记』C++入门——内联函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、内联函数 📒1.1内联函数的概念 📒1.2内联函数的特征 二、auto 📒2.1auto简介 📒2.2auto使用规则 📒2.3auto无法使用的场景 三、基于范围的for循

    2024年02月05日
    浏览(42)
  • 【C++入门】内联函数的秘密

    inline 修饰的函数叫内联函数,编译后会在调用内联函数的地方展开,没有调用函数的开销,可以提高程序运行的效率。 例子: 但是 inline 只是给编译器的一个建议,编译器自己会决定内联函数是否在调用处展开。 内联函数展开是一种空间换时间的做法,可能会造成代码膨胀

    2024年02月12日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包