【C++的内联函数】

news2024/10/5 20:22:41

文章目录

  • 一、什么是内联函数
    • 二、内联函数的优缺点
    • 三、使用内联函数的注意事项

一、什么是内联函数

用关键字inline修饰的函数叫做内联函数。

C++编译器编译时会自动在被调用的地方展开。

二、内联函数的优缺点

内联函数的优点:

没有函数栈帧创建,提升程序运行效率。简单,不易出错,可读性强,可被调试。

内联函数集合了宏函数的优点,摒弃了宏的缺点,
宏的缺点:复杂,容易出错,可读性差。

内联函数的缺点:
如果一个函数的代码量过大,并且频繁被调用,那么在调用的地方展开会极大增加代码量,且代码重复。

所以内联函数适用于代码量比较小且被频繁调用的函数。

注意:

1.inline函数对于编译器来说只是一个建议,真正的决定权在于编译器。
2.递归函数不会被编译器设置成内联的。

3.Debug模式下,inline不会起作用,因为内联函数的本质是在被调用的地方展开,如果在Debug模式下展开了,那就不能被调试了。

Debug模式让内联生效的方法:、
1.右击项目文件鼠标,点击属性
在这里插入图片描述
2.找到如下设置,进行更改

在这里插入图片描述
更改完之后,如下图:

示例代码:

inline int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int ret = Add(2, 3);
	printf("%d ", ret);
	return 0;
}

反汇编代码:
在这里插入图片描述
可以看到,在调用的地方,实实在在地进行了展开。

不过我们也可以干扰编译器做出的决定,因为inline只是建议编译器将该函数变成内联,但是最终的决定权还在编译器。

当编译器认为不合适时,它不会发生内联。

干扰的代码如下:

inline int Add(int x, int y)
{
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;
	cout << "111111111111111111111" << endl;

	return x + y;
}

int main()
{
	int ret = Add(2, 3);
	printf("%d ", ret);
	return 0;
}

结果:

在这里插入图片描述
看到call指令时,这是在调用函数,所以Add函数并没有成为内联函数。

三、使用内联函数的注意事项

1.内联函数不建议声明和定义分离。

因为inline被展开,就没有函数地址了,链接就会找不到。

举一个例子:

fun.h
#pragma once
#include<iostream>
using namespace std;
void fun(int i);


fun.cpp
#include"fun.h"

void fun(int i)
{
	cout << i << endl;
}


test.cpp
#include"fun.h"

int main()
{
	fun(1);
	return 0;
}

有三个文件,文件中的代码分别如上,运行后:
在这里插入图片描述
发生了链接错误。

这是因为,在函数的声明中声明了该函数是内联函数,编译器就会收到这个建议,考虑用内联,并且在函数的定义中,该函数代码量又比较小,所以编译器会直接采纳这个建议,把该函数设置为内联函数,但是, 内联函数的地址在链接阶段的符号表中是没有这个函数的地址的。

编译器在调用的地方只有函数的声明,它只能去符号表中找内联函数的地址,但是却找不到,就出现了链接错误。

所以建议内联函数的声明和定义不要分离。

如果内联函数声明和定义不分离,编译器直接在声明的地方就找到了函数的定义,就不需要到符号表中找函数的地址,就可以链接成功。

总结:
1.能用内联就不要用宏。
2.适合代码量小,频繁调用的地方使用内联函数。
3.内联函数的声明和定义不要分离。

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

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

相关文章

干货分享 | 如何在业余时间学习数据分析?

从社会学背景的数分小白到独揽公司市场部的数据分析&#xff0c;和大家简单分享我的数据分析升级打怪之路。 简单说就是两点【培养数据分析思维】【提升数据分析技能】 思维的培养主要靠书籍和课程 以下是一些对我影响较大的书籍&#xff0c;按照【入门、进阶、高阶】简单做了…

torch.nn.Multiheadattention介绍

初始化参数&#xff1a; class torch.nn.MultiheadAttention(embed_dim, num_heads, dropout0.0, biasTrue, add_bias_kvFalse, add_zero_attnFalse, kdimNone, vdimNone, batch_firstFalse, deviceNone, dtypeNone) 允许模型共同关注来自不同表示子空间的信息。 多头注意力…

C#连接数据库失败,ORA-28040: No matching authentication protocol

C#连接数据库失败 1.原先使用的是oracle11&#xff0c;后来升级数据库到oracle19c&#xff0c;启动程序&#xff0c;数据库连接时报错"ORA-28040: No matching authentication protocol" 2.原因分析&#xff1a;最近服务器数据库版本升级到了19c&#xff0c;网上查了…

【技巧】如何以“只读方式”打开PPT文稿?附两个方法

以“只读方式”打开PPT文稿&#xff0c;可以防止意外修改文稿。今天小编就来介绍一下以“只读方式”打开PPT的两种方法。 方法一&#xff1a;无密码的“只读”模式 1、打开PowerPoint程序&#xff0c;点击菜单中的【文件】选项&#xff0c;再依次点击【打开】-【浏览】。接着在…

FL Studio水果萝卜编曲中文版软件V21版本详细功能介绍

FL Studio十分出色的数字音乐工作软件&#xff0c;其功能大致和Cubase相仿&#xff0c;FL Studio拥有自带的音频插件&#xff0c;并且随着软件的不断更新&#xff0c;使得FL studio不仅仅能够制作电子音乐&#xff0c;同时也能够承担古典、流行等风格的音乐。同时&#xff0c;F…

MySQL:创建数据库,数据表,主键和外键

目录 前言&#xff1a; 安装MySQL&#xff1a; 打开MySQL&#xff1a; 创建数据库&#xff1a; 查看已建数据库&#xff1a; 查看数据库引擎&#xff1a; 创建数据表&#xff1a; 主键约束&#xff1a; 单字段主键&#xff1a; 多字段联合主键&#xff1a; 外键约束&…

《编码——隐藏在计算机软硬件背后的语言》精炼——第11章(门)

“The only source of knowledge is experience.” - Albert Einstein 引言 编码是一种处理并表达信息的方式&#xff0c;它包括摩斯电码、盲文、二进制语言等等&#xff0c;当然作为计算机类的经典书籍&#xff0c;这本书简述了计算机中以二进制数为基础的编码方式&#xff0…

5自由度并联机械臂实现搬运功能

1. 功能说明 本文示例将实现R306样机5自由度并联机械臂搬运牛奶到指定地点的功能。该机械臂由1个5自由度并联机械臂和1个单轴丝杠平台构成&#xff0c;机械臂通过并联的方式同时控制同一个端点的运动。其驱动系统采用大扭矩舵机和小扭矩舵机、执行末端为夹持机构。 2. 并联机械…

SEO优化中的外链与反链是什么意思?它们之间有什么区别?

在SEO优化中&#xff0c;外链和反链是两个非常重要的概念。虽然它们听起来很相似&#xff0c;但实际上却有着很大的区别。那么&#xff0c;什么是外链和反链&#xff1f;它们之间有什么区别呢&#xff1f;本文将为您详细介绍。 一、什么是外链 外链&#xff0c;也被称为入站链…

C++---区间DP---环形石子合并(每日一道算法2023.4.24)

注意事项&#xff1a; 本题是"区间dp—石子合并"的扩展题&#xff0c;dp思路完全一样&#xff0c;就不多详细讲了&#xff0c;可以去那篇文章看&#xff0c;这题主要讲一下如何处理环形。 题目&#xff1a; 将 n 堆石子绕圆形操场排放&#xff0c;现要将石子有序地合…

ES的索引结构与算法解析

作者&#xff1a;京东物流 李洪吉 提到ES&#xff0c;大多数爱好者想到的都是搜索引擎&#xff0c;但是明确一点&#xff0c;ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎&#xff0c;还是有明确搜…

DAY03_循环语句

1&#xff1a;for循环结构 来&#xff0c;继续啊&#xff0c;下面我们来学习循环结构语句&#xff0c;循环结构有三种语句&#xff0c;分别是&#xff1a; for循环 while循环 do…while循环 这三种循环可以做相同的事情&#xff0c;当然它们也有小的区别&#xff0c;至于它…

【LeetCode】322. 零钱兑换

322. 零钱兑换&#xff08;中等&#xff09; 思路 由于题目提到 「每种硬币的数量是无限的」&#xff0c;所以这道题本质上完全背包问题&#xff0c;我直接使用了空间压缩的写法。dp[j] 表示当前区间在 [0, i]的硬币可以表示成 j 的最小数量。注意&#xff0c;这里把 dp数组初始…

windows安装sqli-labs靶场,两种方式

1、安装phpstudy 官网打不开了&#xff0c;下载地址在这儿https://download.csdn.net/download/weixin_59679023/87711536 双击安装 点自定义安装&#xff0c;选择安装目录&#xff0c;注意目录不要有空格和中文 安装完成启动红框内的两个服务 2、安装sqli靶场 这个包支持ph…

4.23学习周报

文章目录 前言文献阅读摘要简介方法结果结论 时间序列预测学习总结 前言 本周阅读文献《A novel hybrid model for water quality prediction based on synchrosqueezed wavelet transform technique and improved long short-term memory》&#xff0c;文献主要提出一种新型混…

动力节点Springsecurity笔记06-13基于数据库的方法授权

6 密码处理 6.1 为什么要加密&#xff1f; csdn 密码泄露事件 泄露事件经过&#xff1a;https://www.williamlong.info/archives/2933.html 泄露数据分析&#xff1a;https://blog.csdn.net/crazyhacking/article/details/10443849 6.2加密方案 密码加密一般使用散列函数&a…

react-9 函数式写法rsc,配合HOOKS基础钩子函数

函数组件和类组件区别&#xff1a; 1.函数组件中没有this 2.函数组件无需继承 3.函数组件默认没有状态&#xff0c;想要使用组件状态必须通过 HOOK 函数引入 4.函数组件默认没有生命周期函数 5.函数组件的渲染&#xff0c;只需要一次函数调用即可 useState &#xff1a;用…

【react全家桶学习】react中JSX语法规则

目录 JSX的定义 XML的含义 JSX的语法规则 &#xff08;1&#xff09;定义类名&#xff0c;用className而不是class &#xff08;2&#xff09;如何使用内联样式设置样式 &#xff08;3&#xff09;虚拟dom必须只有一个根标签 &#xff08;4&#xff09;在react组件中使用变…

谷歌将发布全新搜索引擎,你期待吗?

Google一身自带AI属性的新搜索最首要的目标并非急于取代传统搜索引擎&#xff0c;或者说彻底打败ChatGPT&#xff0c;而是能够用全新的产品说服用户&#xff0c;变得与竞争对手同样“强大、能力出众以及顺应AI潮流”。 对于Google而言&#xff0c;搜索就是命脉。Google每年的收…

Java基础——多线程创建

&#xff08;1&#xff09;什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。程序中只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 &#xff08;2&#xff09;多线程是什么&#xff1f; 多线程是指从软硬件上实现多执行流程的技术。 &…