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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

本文用到的反汇编工具是objconv使用方法可以看我另一篇文章https://blog.csdn.net/weixin_45001971/article/details/128660642

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++