从汇编的角度了解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出来的对象有构造函数会自动调用构造函数。