从汇编的角度了解C++原理——new和malloc的区别

news2024/11/26 20:42:31

文章目录

  • 1、new和malloc的区别
    • 1.1、例程
    • 1.2、总结

本文用到的反汇编工具是objconv,使用方法可以看我另一篇文章https://blog.csdn.net/weixin_45001971/article/details/128660642。
其它文章:
从汇编的角度了解C++原理——类的储存结构和函数调用
从汇编的角度了解C++原理——new和malloc的区别
从汇编的角度了解C++原理——虚函数

1、new和malloc的区别

1.1、例程

在这里插入图片描述
转换后,得到汇编代码。

main:
        sub     rsp, 104                        
        /* malloc int */      
        mov     ecx, 4                        //需要分配的内存大小        
        call    near [rel __imp_malloc]       //调用malloc的汇编子程序,返回值存到rax寄存器        
        mov     qword [rsp+40H], rax   		  //初始化指针m
        
		/* new int */               
        mov     ecx, 4                               
        call    ??2@YAPEAX_K@Z                //调用new的汇编子程序,返回值存到rax寄存器   
        mov     qword [rsp+30H], rax          //       
        mov     rax, qword [rsp+30H]               
        mov     qword [rsp+48H], rax          //初始化指针i
         
		/* new class A */                 
        mov     ecx, 4                           
        call    ??2@YAPEAX_K@Z             	  //为A类对象分配内存         
        mov     qword [rsp+20H], rax      
                    
        cmp     qword [rsp+20H], 0            //检查是否分配成功         
        jz      ?_001                         //失败则将a指针置0,即返回NULL  
            
        mov     rcx, qword [rsp+20H]          //把创建的对象存入rcx,作为this指针供构造函数使用       
        call    ??0A@@QEAA@XZ                 //调用A类构造函数   
        mov     qword [rsp+28H], rax          //初始化指针a       
        jmp     ?_002                         //默认的指针操作     

?_001:  mov     qword [rsp+28H], 0                     
?_002:  mov     rax, qword [rsp+28H]               
        mov     qword [rsp+38H], rax              
        mov     rax, qword [rsp+38H]                 
        mov     qword [rsp+50H], rax                
        mov     eax, 4294967295                
        add     rsp, 104                            
        ret                                     

1.2、总结

malloc和new的区别:
1、malloc分配内存时调用的汇编子程序是__imp_malloc,而new调用的是??2@YAPEAX_K@Z。
2、new在分配完内存后,如果new出来的对象有构造函数,会自动调用构造函数。

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

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

相关文章

【索引】引用A survey on pickup and delivery problems的文章

1. Dynamic container drayage with uncertain request arrival times and service time windows⭐️ 具有不确定请求到达时间和服务时间窗口的动态集装箱运输 Container drayage plays a critical role in intermodal global container transportation, as it accomplishes th…

hud 1846巴什博弈(简单的解法 或 Sprague-Grundy解法)

各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的: 1、 本游戏是一个二人游戏; 2、 有一堆石子一共有n个; 3、 两人轮流进行; 4、 每走一步可以取走1…m个石子; 5、 最先取光石子的一方为胜; 如…

不懂Token,就是别说自己是中级测试工程师

官方回答: Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。 基于工程师的理解: token就相当于客户…

Go语言初始

"当我回头,妄想找到幸福的线索,那束光拉长我的影子,逃离我。"一、Go简介Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强乐西、编译型语言。Go 语言语…

Unicorn反混淆:恢复被OLLVM保护的程序(一)

一、目标 现在很多程序利用ollvm的控制流平坦化来增加逆向分析的难度。 控制流平坦化 (control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程 1:show1 经过控制流平坦化后的执行流程就如下图: 1:show2 …

RT-Thread系列--启动过程

一、目的RT-Thread是一个小而美的RTOS,所有的RTOS的都有一个特点,那就是存在调度器,像RT-Thread的调度器是一个实时抢占式调度器(同优先级任务使用时间片调度方式)。本篇不讲调度器相关的内容,着重讲解调度…

【博客591】LVS的DR和NAT模式下要注意的缺陷

LVS的DR和NAT模式下要注意的缺陷 1、DR模式和NAT模式的转发原理 2、LVS的DR和NAT模式下要注意的缺陷 缺陷1:DR模式下的realserver和 lvs的vip提供服务的端口必须一致。 例如vip的端口对外端口为 80,但后端服务的真实端口为8080,通过lvs的D…

SpringBoot快速上手

SpringBoot 概述 Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序,您可以“直接运行”。 特征 创建独立的 Spring 应用程序 直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件) 提供固执己见的“入门”依赖项…

初始C语言 - 函数(2)

目录 1.函数的嵌套调用和链式访问 1)函数嵌套调用 2)函数的链式访问 - 函数的返回值作为另一个函数的参数 2. 函数的声明和定义 1)变量的声明和定义 2)函数的声明和定义 //函数必须先声明后使用//函数的声明写在头文件里 3.…

集成学习、Bagging集成原理、随机森林构造过程、随机森林api与案例、boosting集成原理、梯度提升决策树(GBDT)、XGBoost与泰勒展开式

一、集成学习 集成学习:通过建立几个模型来解决单一预测问题,工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测 机器学习的两个核心任务 集成学习中boost…

【UE4 第一人称射击游戏】51-制作手榴弹

上一篇:【UE4 第一人称射击游戏】50-用另一种方法实现僵尸随机漫游 僵尸攻击玩家时造成伤害本篇效果:按G键投掷出手榴弹,产生爆炸效果步骤:新建一个蓝图类(父类为Actor),命名为“GrenadeActor”…

水声功率放大器模块在圆柱壳结构声源辐射研究中的应用

客户需求:实验需要在消声水池中对圆柱壳声源振动和远场声压进行实验测量,圆柱壳内部尺寸为:高0.5m(不含盖板),壳外径0.5,内径0.497m,上下盖板高0.014m,所以对圆柱壳内功率放大模块的尺寸以及供电…

Qt图表操作(QCustomPlot 与 QtCharts的介绍与使用)

一、QCustomPlot简介 QCustomPlot是QT下一个方便易用的绘图工具,该绘图库专注于制作美观,出版品质的2D图表,图表和图表,以及为实时可视化应用程序提供高性能。它可以导出为各种格式,如矢量化的PDF文件和光栅化图像&…

Task12 数据缘何而来数据格式

目录1 常见的格式1.1 Excel文件的格式1.2 Excel数据的格式1.3 基本知识2 Excel数据格式2.1 数据类型转换3 练习1 常见的格式 1.1 Excel文件的格式 Excel文件的常见格式:.xls和.xlsx 1.2 Excel数据的格式 Excel数据的存储不同格式:xlsx、csv、txt cs…

mysql快速生成100W条测试数据(8)全球各城市人口及经济增长速度并存入mysql数据库

这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据(1):游戏人物数据 mysql快速生成100W条测试数据(2)公司员工信息 mysql快速生成100W条测…

本地挂载网盘_Alist_RaiDrive_windows

目录 一、下载安装Alist 二、启动登录Alist 三、挂载网盘 四、挂载到本地 五、开机自启动 一、下载安装Alist 安装地址:https://github.com/alist-org/alist 二、启动登录Alist 1.打开alist.exe所在目录,输入cmd 2.利用cmd,输入alist …

[oeasy]python0051_ 转义_escape_字符_character_单引号_双引号_反引号_ 退格键

转义字符 回忆上次内容 上次研究的是进制转化10进制可以转化为其他形式 binocthex 其他进制也可以转化为10进制 int可以设置base来决定转为多少进制 回忆一下 我们为什么会有八进制?因为需要用八进制输出转义字符 \ooo 把(ooo)8进制对应的ascii字符输出 就如同 \…

QMAKE_POST_LINK QMAKE_PRE_LINK解释

命令解释 QMAKE_POST_LINK是在可执行程序链接后执行它的命令 QMAKE_PRE_LINK是在可执行程序链接前执行它的命令 注意C/C程序是先编译后链接 如果你需要一个编译前执行的命令可以使用 copy_files.files $$filelist copy_files.path $$OUT_PWD COPIES copy_files即使是编…

存储与数据库 | 字节青训营笔记

目录 一、存储系统 1、什么是存储系统 2、存储系统的特点 3、RAID技术 RAID出现的背景 RAID 0 RAID 1 RAID 01 二、数据库 1、难道数据库和存储系统不一样吗 2、数据库vs经典存储 三、主流产品剖析 1、单机存储 本地文件系统 key-value存储 2、分布式存储系统 …

【程序员陪你过大年】html+css+js 实现春节动态烟花特效及服务器部署

前言 不知不觉又到了年底,这一年是值得庆贺的一年,疫情过去,经济好转。我们急需在春节这个特殊的日志释放下自己的情绪。但是大部分地区都不让放炮,于是乎我为大家带来一套十分炫酷应景的春节烟花动画代码实现。效果如下图所示 :…