内联函数inline

news/2024/7/3 6:56:44

结论在文章末尾处!

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

内联函数的处理方式是在函数的调用点直接代码展开。在计算机系统下,假如频繁的调用就会造成较大的时间开销。内联函数的引入减少了函数调用过程中开栈和清栈的开销。

下面来看不使用内联函数的时候:

#include<iostream>
using namespace std;int Add_int(int a, int b)
{return a + b;
}int main()
{int a = 10, b = 20;int c = Add_int(a,b);cout << "c" << "=" << c << endl;system("pause");return 0;
}

打开汇编:

 可以看到的是,先将b入栈,然后将a入栈,再通过call调用Add_int函数!

下面看一下使用内联函数之后:

#include<iostream>
using namespace std;inline int Add_int(int a, int b)  //在函数前面加上inline
{return a + b;
}int main()
{int a = 10, b = 20;int c = Add_int(a,b);cout << "c" << "=" << c << endl;system("pause");return 0;
}

打开她的汇编:

 我们打开汇编之后发现还是和之前没加内联函数inline之前的汇编是一样的,这是怎么回事呢,原来我们加没加inline都是处在debug版本下,inline在debug版本下是不生效的,只有在release 版本下inline才生效,那么我们切换到release版本下再来打开汇编:

 我们发现就没有了入栈那些个操作,直接在调用函数那块就将函数展开了!

那么内联函数有什么需要注意的呢?

1.nline函数一般写在头文件中。(当多文件使用到同一个inline函数,就得写在头文件中)

2.inline函数只在Release版本生效。在Debug版本是不生效。

3.inline函数只是给编译器的一个建议。具体是否处理成inline函数是编译器决定的。

第三点具体是怎样的呢,如果说你的内联函数体内有循环、判断语句这种的话,就算是你加了内联函数inline,编译器也不会按照内联函数进行处理,还有就是当内联函数函数体过大时也不会按照内联函数进行处理,这个过大没个具体值,可能是多于十行或是20行,对于某些编译器来说,当你给有判断语句与循环语句或函数体大的函数加inline之后,会进行报错(看编译器)!

还有以一个需要注意的点就是内联函数与宏的区别:

        inline函数的处理时机是在编译阶段处理的,有安全检查和类型检查。而宏的处理是在预编译阶段处理的,没有任何检查机制,只是简单的文本替换。inline函数是一种更安全的宏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/15603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

TCP的协议特点(对于《Linux高性能服务器编程》的部分摘录以及自己的部分见解)

一.TCP协议特点为面向连接、字节流和可靠传输 面向连接&#xff1a;使用TCP协议通信的双方必须先建立连接&#xff0c;然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源&#xff0c;以管理连接的状态和连接上数据的传输。TCP连接是全双工的&#xff0c;即双方的…

【SVN多用户开发】代码冲突解决办法

SVN是一款集中式的代码存储工具&#xff0c;可以帮助多个用户协同开发同一应用程序。 但是SVN不能完全代替人工操作&#xff0c;有时也需要程序员自己进行沟通确认有效的代码。 下面就简单的看一下&#xff0c;常见的代码冲突以及解决方法。 总结起来&#xff0c;无非是&#x…

UDP通信协议详解

中文名 用户数据报协议英文名 User Datagram Protocol 基础 IP数据包服务上增加一点功能 类别 传输层协议 特点 无连接、不可靠、快速传输 用途发送IP数据包 如右图所所示为udp协议的基本信息 上图就是UDP的数据报服务,sendto两次发送的是单独的两个个体,接收端…

简单的HTTP服务器程序的编写

HTTP 协议一般指 HTTP&#xff08;超文本传输协议&#xff09;。 超文本传输协议&#xff08;英语&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议&#xff0c;是因特网上应用最为…

【C++】何时需要自定义拷贝构造函数和赋值符

先来说结论&#xff1a;当类中有指针类型成员变量的时候&#xff0c;一定要自定义拷贝构造和赋值运算符 原因&#xff1a;当我们在有指针类成员变量的时候&#xff0c;还是用默认拷贝构造函数(拷贝构造函数执行的时候会调用赋值符)&#xff0c;默认赋值为浅拷贝&#xff0c;会…

iOS自动布局一

Align: Pin&#xff1a; 转载于:https://www.cnblogs.com/123qw/p/4404167.html

【C++】左值、右值、移动拷贝构造函数、移动赋值函数

左值和右值的定义以及区别: 先来看在C语言中的左值和右值 &#xff1a; 左值&#xff1a;可赋值的值为左值 右值&#xff1a;不可赋值的值为右值 再来看C中左值右值的定义如下&#xff1a; 左值&#xff1a;可以取地址的值&#xff08;有名字的值、非临时量&#xff09; …

【C++】typedfe和宏定义的区别

先来说结论&#xff1a; 1.宏定义作用于编译之前(也就是预编译阶段&#xff0c;而typedef作用于编译阶段 2.typedef仅限于类型的重定义&#xff0c;而宏定义不仅可以为类型起别名还可以为数值定义起别名(简单的替换) 下面来看一下区别 下面这是typedef的用法 typedef int* PI…