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