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

本文用到的反汇编工具是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出来的对象有构造函数,会自动调用构造函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值