当前位置: 首页 > news >正文

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

文章目录

  • 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出来的对象有构造函数,会自动调用构造函数。

相关文章:

  • 做百度移动网站/免费网站流量统计
  • 游戏网站制作模板/百度热搜榜排名昨日
  • 网站开发过程的需求分析/海南百度推广公司
  • 国外素材网站/今日十大头条新闻
  • 静态网站怎么制作/郑州网站推广公司咨询
  • 萧县哪有做网站的/如何让百度搜索到自己的网站
  • Dubbo 自适应SPI
  • 微信小程序登陆,后端接口实现 - springboot
  • echarts柱状图值为0时不显示以及柱状图百分比展示
  • 2022年艺术品和古董投资策略研究报告
  • 改进YOLOv7系列:首发最新基于GFL损失函数,让模型无损涨点,NeurIPS 顶会论文|无cost涨点,多种热门检测模型已使用
  • jvm垃圾回收笔记
  • 跨平台API对接(Python)的使用
  • Vue知识系列-axios
  • 【Linux】supervisor创建守护进程
  • 惊艳的产品背后,是锐利的设计思维
  • Notion 汉化Macwindows客户端
  • 绝了,超越YOLOv7、v8,YOLOv6 v3.0正式发布