从汇编以及栈帧层面理解内联函数的原理

宏太复杂,所以弄出内联,内联适合小函数,把函数连到程序里面,这样就直接用,不需要调用,但是它占用空间。

C++推荐
const和enum替代宏常量
inline去替代宏函数

宏缺点:
1、不能调试
2、没有类型安全的检查
3、有些场景下非常复杂,容易出错,不容易掌握

(1)概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

image-20240310144027371.png

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的 调用。

查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add

  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不

会对代码进行优化,以下给出vs2013的设置方式)

image-20240310144151040.png

image-20240310144201715.png

(2)特性

编译器选择性内联,长的代码一般是call调用,短的频繁用的一般就会展开内联。一个很大的函数,你弄成内联,编译器也不会展开内联,不会鸟你。

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同**,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、**不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为《C++prime》第五版关于inline的建议:

image-20240310144318210.png

  1. inline不建议声明和定义分离,分离会导致链接错误 m。因为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 中被引用

函数调用过程,call到jmp,jmp调到函数栈帧。内联函数没有栈帧,直接在程序展开,不需要调用。

CT-20240310075258.png

所以 内联函数不要声明与定义分离,直接在.h文件中定义,调用时会直接展开在.cpp文件,声明和定义分离是为了好看,内联函数不需要分离。

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

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

相关文章

RHCE实验-建立NFS服务器,使的客户端顺序共享数据

第一步&#xff1a;服务端及客户端的准备工作 # 恢复快照[rootserver ~]# setenforce 0​[rootserver ~]# systemctl stop firewalld​[rootserver ~]# yum install nfs-utils -y # 服务端及客户端都安装 第二步&#xff1a;服务端建立共享文件目录&#xff0c;并设置权限…

ClickHouse06-ClickHouse中基础的增删改查

使用数据库&#xff0c;最基础的学习都是增、删、改、查&#xff0c;然后才会去了解基础函数和高阶函数&#xff0c;今天就来看看大火的 ClickHouse 中简单的增删改查怎么写&#xff1f; 创建数据库&#xff1a;create database创建表格&#xff1a;create table修改表格&…

反射率光纤光谱仪检测汽车后视镜反射率

反射率光纤光谱仪是一种用于测量材料表面反射率的精密仪器&#xff0c;它通过光纤传输光信号&#xff0c;并利用光谱仪进行分析&#xff0c;以确定材料的光学特性。反射率光纤光谱仪的工作原理基于相对反射率的计算&#xff0c;它涉及到光源、光纤、光谱仪等关键组件。 后视镜能…

深入了解服务器硬件:从基础知识到实际应用

在当今数字化的社会中&#xff0c;服务器扮演着至关重要的角色&#xff0c;它们是支撑互联网、云计算、大数据等技术发展的基石。而理解服务器硬件的基础知识对于从事IT领域的人员来说至关重要。本文将从服务器硬件的基础知识出发&#xff0c;介绍服务器硬件的组成、作用及其在…

【笔记】OpenHarmony设备开发:搭建开发环境(Ubuntu 20.04,VirtualBox 7.0.14)

参考&#xff1a;搭建开发环境&#xff08;HarmonyOS Device&#xff09; Note&#xff1a;Windows系统虚拟机中Ubuntu系统安装完成后&#xff0c;根据指导完成Ubuntu20.04基础环境配置&#xff08;HarmonyOS Connect 开发工具系列课&#xff09; 系统要求 Windows系统要求&…

刷题日记——济南大学机试

折戟厦大&#xff0c;考虑调剂济南大学&#xff0c;但是更想去的是杭师大&#xff0c;还是刷题&#xff0c;济南大学比厦门大学题目简单很多&#xff0c;因此一篇文章不多分析&#xff0c;直接给出代码&#xff0c;全部采用纯C语言编写并且AC&#xff0c;不用C的stl库。 争取今…

CentOS Stream 8系统配置阿里云YUM源

Linux运维工具-ywtool 目录 一.系统环境二.修改yum文件2.1 CentOS-Stream-AppStream.repo2.2 CentOS-Stream-BaseOS.repo2.3 CentOS-Stream-Extras.repo 三.只有一个配置文件四.其他知识4.1 如果想要启用其他源,修改文件配置:enabled14.2 国内源链接 一.系统环境 CentOS Strea…

DevSecOps平台架构系列-微软云Azure DevSecOps平台架构

目录 一、概述 二、Azure DevOps和黄金管道 2.1 概述 2.2 Azure DevOps架构说明 2.2.1 架构及管道流程图 2.2.2 架构内容 2.2.2.1 Azure Boards 2.2.2.2 Azure Repos 2.2.2.3 Azure Test Plans 2.2.2.4 Azure Pipelines 2.2.2.5 Azure Application Insights 2.2.2.6…

论文阅读---VITC----Early Convolutions Help Transformers See Better

论文题目&#xff1a;Early Convolutions Help Transformers See Better 早期的卷积网络帮助transformers性能提升 vit 存在不合格的可优化性&#xff0c;它们对优化器的选择很敏感。相反现代卷积神经网络更容易优化。 vit对优化器的选择[40](AdamW [27] vs. SGD)&#xff0…

中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念 1、时序数据 时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图&#xff0c;CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据&#xff0c;也就是我们常常听到的“数据可视化”。 2、时序数据库 非关系型数据库&#…

机器学习实验作业一----knn算法

机器学习课程的第一个算法knn算法&#xff0c;全称K-Nearest Neighbor&#xff0c;k最邻近算法&#xff0c;为机器学习中最常用&#xff0c;也是最简单的算法。KNN通过测量不同特征值之间的距离来进行分类。本文实现的是较为简单的knn算法&#xff0c;包括测试集&#xff0c;训…

pytorch中关于BF16、FP16的一些操作

文章目录 前提创建BF16和FP16的数据BF16和FP16的二进制存储格式如何根据十进制数得到对应的二进制存储如何根据二进制存储计算对应的十进制数&#xff1f;第一种方法第二种方法 二进制乘法如果是负数怎么办&#xff1f;如何手动计算BF16对应的的二进制存储格式参考链接 前提 好…

湖北汽车工业学院 实验一 关系数据库标准语言SQL

头歌 实验一 关系数据库标准语言SQL 制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01; 目录 头歌 实验一 关系数据库标准语言SQL**制作不易&#xff01;点个关注呗&#xff01;为大家创造更多的价值&#xff01;** 第一关&#xff1a;创建数据库第…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件&#xff0c;这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

脏牛提权(靶机复现)

目录 一、脏牛漏洞概述 二、漏洞复现 1.nmap信息收集 1.1.查看当前IP地址 1.2.扫描当前网段&#xff0c;找出目标机器 1.3.快速扫描目标机全端口 三、访问收集到的资产 192.168.40.134:80 192.168.40.134:1898 四、msf攻击 1.查找对应exp 2.选择对应exp并配置相关设…

基于nodejs+vue健美操评分系统python-flask-django-php

本系统采用的数据库是MySQL&#xff0c;使用nodejs技术开发。在设计过程中&#xff0c;很好地发挥了该开发方式的优势&#xff0c;让实现代码有了良好的可读性&#xff0c;而且使代码的更新和维护更加的方便&#xff0c;操作方便&#xff0c;对以后的维护减少了很多麻烦。系统的…

wpf程序调用macad的c++编写的dll

1.把macad里的build&#xff0c;source文件夹复制到一个文件夹里 2.创建一个wpf项目&#xff0c;在解决方案里添加macad.occt项目 3.把macad.occt设为dll文件&#xff0c;修改平台工具集&#xff0c;在macadtest里引用macad.occt 4.运行&#xff0c;应该会报错&#xff0c;说找…

「09」媒体源:播放本地或在线的音视频GIF文件

「09」媒体源播放本地或在线的音视频GIF文件 通过媒体源功能&#xff0c;您可以添加自己想要展示的各种视频内容&#xff0c;例如自己的视频课程、电影或客户见证视频、以及GIF动画等。 &#xff08;图层叠加效果&#xff09; &#xff08;绿幕抠像叠加效果&#xff09; 缺点…

Covalent Network(CQT)的以太坊时光机:在 Rollup 时代确保长期数据可用性

以太坊正在经历一场向 “Rollup 时代” 的转型之旅&#xff0c;这一转型由以太坊改进提案 EIP-4844 推动。这标志着区块链技术的一个关键转折&#xff0c;采用了一种被称为“数据块&#xff08;blobs&#xff09;”的新型数据结构。为了与以太坊的扩容努力保持一致&#xff0c;…

解析汽车充电桩主板的常见故障表现、原因及应对方法

充电桩主板作为充电桩的核心组件&#xff0c;直接影响着充电桩运行的安全性与稳定性。然而&#xff0c;在使用过程中&#xff0c;充电桩主板难免会因各种原因而出现一些故障情况&#xff0c;因此&#xff0c;了解这些原因并采取相应的应对方法对维护充电桩的正常运行起着至关重…