C++ summary 工具 Insights: 源码工具:应用篇 inline函数

  • 介绍篇

  • 在线执行
    在这里插入图片描述

  • 悬停,显示帮助
    在这里插入图片描述

  • 右键,查看文档
    在这里插入图片描述

在这里插入图片描述

  • template
    在这里插入图片描述

example_1

int main(){
    int a = 123;
    return 0;
}
(gdb) disas
Dump of assembler code for function main():
   0x0000555555555129 <+0>:	endbr64 
   0x000055555555512d <+4>:	push   %rbp
   0x000055555555512e <+5>:	mov    %rsp,%rbp
=> 0x0000555555555131 <+8>:	movl   $0x7b,-0x4(%rbp)
   0x0000555555555138 <+15>:	mov    $0x0,%eax
   0x000055555555513d <+20>:	pop    %rbp
   0x000055555555513e <+21>:	ret    
End of assembler dump.
main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 123
        mov     eax, 0
        pop     rbp
        ret

example_2

int main(){
    static int a = 123;
    return 0;
}
(gdb) disas
Dump of assembler code for function main():
   0x0000555555555129 <+0>:	endbr64 
   0x000055555555512d <+4>:	push   %rbp
   0x000055555555512e <+5>:	mov    %rsp,%rbp
=> 0x0000555555555131 <+8>:	mov    $0x0,%eax
   0x0000555555555136 <+13>:	pop    %rbp
   0x0000555555555137 <+14>:	ret    
End of assembler dump.
main:
        push    rbp
        mov     rbp, rsp
        mov     eax, 0
        pop     rbp
        ret

example_3

int main(){
    const int a = 123;
    return 0;
}
(gdb) disas
Dump of assembler code for function main():
   0x0000555555555129 <+0>:	endbr64 
   0x000055555555512d <+4>:	push   %rbp
   0x000055555555512e <+5>:	mov    %rsp,%rbp
=> 0x0000555555555131 <+8>:	movl   $0x7b,-0x4(%rbp)
   0x0000555555555138 <+15>:	mov    $0x0,%eax
   0x000055555555513d <+20>:	pop    %rbp
   0x000055555555513e <+21>:	ret    
End of assembler dump.
main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 123
        mov     eax, 0
        pop     rbp
        ret

inline函数

在这里插入图片描述
使用 inline 关键字可以对函数进行内联展开(inline expansion),这意味着函数的代码会被直接插入调用它的地方,而不是通过函数调用的方式执行。inline 在编译器的编译阶段被处理)(需要注意的是,inline 仅仅是对编译器的一个提示,编译器完全有权决定是否内联展开函数。它可能会忽略 inline 提示,特别是在一些情况下,如递归函数、虚函数、函数体过大等情况)。使用 inline 可以有以下优点和缺点:

优点:

  1. 提高执行速度:内联展开可以消除函数调用的开销,因为不需要在运行时跳转到函数的位置执行代码。这可以在一定程度上提高程序的执行速度,尤其是对于短小的函数。
  2. 节省函数调用栈:函数调用会在运行时创建调用栈,包含函数参数和返回地址等信息。内联展开可以避免创建和销毁调用栈,从而减少了一部分内存开销,并且可以提高程序的效率。
  3. 编译器优化:内联函数通常会被编译器视为宏替换,使编译器有更多的优化机会,如常量替换、循环展开等。这可以进一步提高程序的性能。

缺点:

  1. 增加代码尺寸:内联展开会导致函数的代码被复制到多个调用点,增加了可执行文件的尺寸。对于一些较大的函数,这可能会增大可执行文件的大小,从而降低缓存效率。
  2. 增加编译时间:内联函数的代码会在每个调用点都进行复制和插入,这可能导致编译时间的增加,特别是当内联函数被频繁调用时。
  3. 可读性和维护性下降:内联函数的代码被复制到多个地方,可能会导致代码重复,并且使代码变得分散。这可能会降低代码的可读性和维护性,特别是在需要对函数进行修改或调试时。

综上所述,使用 inline 可以提高程序的执行效率和编译器的优化机会。然而,应该谨慎使用 inline,并根据函数的大小、调用频率以及代码的可读性和维护性需求来权衡其优缺点。对于短小的、频繁调用且性能关键的函数,使用 inline 可能是合适的选择。

cg

  • EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP 寄存器详解

rax rsp是什么

rax(全名为 Accumulator register)是通用目的寄存器之一。在64位模式下,rax 是一个64位寄存器,可以用于存储和操作64位的数据。rax 在函数调用中常用于存储函数返回值。

rsp(全名为 Stack Pointer register)是栈指针寄存器,它指向当前栈的顶部。栈是一块特殊的内存区域,用于存储函数调用过程中的局部变量、函数参数和返回地址等。rsp 的值会随着函数的调用和返回而不断变化,用于管理栈帧的创建和销毁。

  • sub rsp, 0x10: 这条指令将栈指针 rsp 减去一个常数值 0x10,即在栈上分配 16 字节的空间。这通常用于为函数调用准备局部变量或保存临时数据。

  • lea rax, [rsp+0xf]: 这条指令使用地址计算,即将 rsp 寄存器的值加上常数 0xf,结果存储在 rax 寄存器中。这样做的目的是获得 rsp 寄存器向上对齐到 16 字节边界的地址。(lea destination, source, destination 是目标寄存器,用于存储计算得到的地址,source 则表示源操作数,可以是一个内存地址、寄存器或立即数)

  • and rax, 0xfffffffffffffff0: 这条指令将 rax 寄存器的值与常数 0xfffffffffffffff0 进行按位与操作,将 rax 的低 4 位清零,得到一个 16 字节对齐的地址。

  • mov QWORD PTR [rdi], rax: 这条指令将 rax 的值存储到以 rdi 寄存器作为地址的内存位置,即将 rax 的值存储到 rdi 指向的内存中。

从内存中读取 rsp+0x8 地址处的一个 64 位值,然后检查这个值是否为零。根据比较结果,当这个值不为零时,跳转到地址 401145 继续执行后续的指令。

  1. mov rax, QWORD PTR [rsp+0x8]: 这条指令将 rsp 寄存器的值加上偏移量 0x8,然后将结果作为地址,从内存中读取一个 8 字节(64位)的值,并将其存储到 rax 寄存器中。这样做的目的是获取 rsp+0x8 地址处存储的数据。

  2. cmp BYTE PTR [rax], 0x0: 这条指令将 rax 寄存器的值作为地址,从内存中读取一个字节(8位)的值,与常数 0x0 进行比较。这里的目的是检查 rax 寄存器指向的内存位置中的值是否为零(空字节)。

  3. jne 401145 <main+0x85>: 这条指令根据上一条 cmp 指令的结果,当比较结果为不相等(即不为零)时,跳转到地址 401145 处执行。这里是根据条件执行的跳转,当前偏移量 0x85 是相对于当前指令的偏移地址。

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

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

相关文章

2023年【陕西省安全员C证】新版试题及陕西省安全员C证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证新版试题参考答案及陕西省安全员C证考试试题解析是安全生产模拟考试一点通题库老师及陕西省安全员C证操作证已考过的学员汇总&#xff0c;相对有效帮助陕西省安全员C证复审模拟考试学员顺利通过考试。…

C#有望成为2023年的编程语言之王

前言 TIOBE 2023年12月编程语言指数头条新闻&#xff1a;C#有望成为2023年的编程语言之王。 TIOBE是什么&#xff1f; 访问地址&#xff1a;https://www.tiobe.com/tiobe-index/ TIOBE是一个编程社区指数&#xff0c;用于衡量不同编程语言的受欢迎程度。TIOBE指数基于全球范围…

接口自动化测试框架【AIM】

最近在做公司项目的自动化接口测试&#xff0c;在现有几个小框架的基础上&#xff0c;反复研究和实践&#xff0c;搭建了新的测试框架。利用业余时间&#xff0c;把框架总结了下来。 AIM框架介绍 AIM&#xff0c;是Automatic Interface Monitoring的简称&#xff0c;即自动化…

pytest之allure测试报告02:allure具体使用方法

一、allure包含的方法 二、allure使用教程 &#xff08;1&#xff09;用例中写入allure方法 allure.epic("数据进制项目epic") allure.feature("手机号模块feature") class TestMobile:allure.story("杭州的手机号story")allure.title("测…

桌面概率长按键盘无法连续输入问题

问题描述&#xff1a;概率性长按键盘无法连续输入文本 问题定位&#xff1a; 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的&#xff0c;这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后&#xff0c;会转发到相应程序的窗口中。在窗…

单片机——通信协议(UART协议解析篇)

一、引言 在嵌入式系统设计中&#xff0c;UART通信是一种广泛使用的串行通信协议&#xff0c;它通过两条信号线实现全双工的数据传输和接收。UART通信协议以其简单、灵活和易于集成的特点&#xff0c;在嵌入式设备之间以及与外部设备进行通信时发挥着重要作用。本文将详细介绍U…

VS Code连接远程Linux服务器调试C程序

1.在 VS Code 上安装扩展 C/C 2.通过 VS Code 连接远程 Linux 服务器 3.通过 VS Code 在远程 Linux 服务器上安装扩展 C/C 4.打开远程 Linux 服务器上的文件夹 【注】本文以 /root/ 为例。 5.创建项目文件夹&#xff0c;并在项目文件夹下创建C程序 6.按 F5&#xff0c;选…

浅显易懂 @JsonIgnore 的作用

1.JsonIgnore作用   在json序列化/反序列化时将java bean中使用了该注解的属性忽略掉 2.这个注解可以用在类/属性上   例如&#xff1a;在返回user对象时&#xff0c;在pwd属性上使用这个注解&#xff0c;返回user对象时会直接去掉pwd这个字段&#xff0c;不管这个属性有没…

Linux Shell——(脚本参数传递)

脚本参数传递 一、参数传值二、脚本文件中特殊的变量 总结 最近学习了shell脚本&#xff0c;记录一下shell脚本参数传递相关语法 一、参数传值 执行脚本的时候&#xff0c;可以向脚本传递参数&#xff0c;脚本内获取参数的格式为$n n位置从1开始&#xff0c;$0 是脚本的文件名…

(代码详解)绘制气泡图+详细讲解图例设置+如何正确理解气泡图+气泡大小、颜色+调参

目录 气泡图简介&#xff1a; 一、导入库 二、准备数据 三、画气泡图--基础版 四、画气泡图--进阶版一 (控制气泡大小) 解读气泡图&#xff1a; 五、画气泡图--进阶版二(控制气泡颜色) (一)用参数c控制气泡颜色 (二)用for循环的方法控制气泡颜色 (三)给气泡分配指定的颜…

FFmpeg——在Vue项目中使用FFmpeg(安装、配置、使用、SharedArrayBuffer、跨域隔离、避坑...)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Kali Linux安装Xrdp远程桌面工具结合内网穿透实现远程访问Kali桌面

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于&#xff0c;它允许用户从远程位置访问Kali系统&#xff0c;而无需直接物理访…

韩顺平学java第二阶段之BS框架002

这边讲了php都可以&#xff0c;反正就是打通双方的间隔就行了∑(っД;)っ卧槽&#xff0c;不见了

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass

尚硅谷Docker笔记-基础篇

B站视频&#xff1a;https://www.bilibili.com/video/BV1gr4y1U7CY 1.Docker简介 解决了运行环境和配置问题的软件容器 方便做持续集成并有助于整体发布的容器虚拟化技术 容器与虚拟机比较 Docker 容器是在操作系统层面上实现虚拟化&#xff0c;直接复用本地主机的操作系统…

12、ble_mesh_vendor_model 服务端,自定义模型

1、初始化流程&#xff0c;存储初始化&#xff0c;nvs擦除&#xff0c; board_init();初始化LED。 2、bluetooth_init();ble协议栈初始化 3、ble_mesh_get_dev_uuid(dev_uuid);//获取设备uuid加载到mac&#xff0c;后两位dev uuid 4、ble_mesh_init();//ble mesh协议栈初始化。…

使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…

关键点检测之修改labelme标注的json中类别名

import json import os import shutil#source_dir表示数据扩增之后的文件夹路径&#xff0c;此时标注的是多分类的标签 #new_dir表示转化之后得到的二分类文件夹def to2class():#json存放路径source_dir r1#json保存路径new_dir r1for i in os.listdir(source_dir):if i.ends…

十七、如何将MapReduce程序提交到YARN运行

1、启动某个节点的某一个用户 hadoopnode1:~$ jps 13025 Jps hadoopnode1:~$ yarn --daemon start resourcemanager hadoopnode1:~$ jps 13170 ResourceManager 13253 Jps hadoopnode1:~$ yarn --daemon start nodemanager hadoopnode1:~$ jps 13170 ResourceManager 15062 Jp…

D3D12可编程渲染流水线

一、初始化D3D库 启用 DirectX数学库 x86需要启用SSE2指令集&#xff0c;所有平台均需将浮点模型设置为fast。默认为&#xff1a; 精度 (/fp:precise)。 #include <DirectXMath.h> #include <DirectXPackedVector.h> 启用调试模式下的内存泄漏检测 // Enabl…