C/CPP中的malloc和new的差异
差异 New CPP malloc
2023-06-13 09:15:04 时间
引入
如何申请内存?使用malloc/new,如何为一个类对象申请内存呢?使用new,为什么要设计两套接口呢?差异是什么?
malloc和new的差异
malloc
第一条指令是把数值4赋给寄存器edi,为后面的函数调用准备参数,详细分析见CPU里的参数传递。
第二条指令是调用malloc函数,可以猜出这是要申请4个字节大小的内存块,这样看来malloc是一个单纯的函数,输入所需的内存的大小就可以帮我们申请想要大小的内存块。
new
前两条指令跟malloc十分相似,第一条指令是传递参数值8,因为类A仅有2个int类型的成员变量,所以A的大小是8个字节,
到目前为止注意类对象还需要调用构造函数进行初始化。
下面两条指令,第一条指令:把申请到的内存地址传递给寄存器rdi(调用构造函数也是需要传递this指针的)
完成了this指针的传递就可调用类A的构造函数了,及最后一条指令。
至此new操作全部完成。
free和delete的差异
free
free是malloc的反向操作,也是一个纯函数接口。它的用途是释放归还刚才申请的内存。
delete
delete是new 的反向操作,首先调用类A的析构函数
然后就可以跟free一样释放、归还类A对象所占据的内存空间。
总结
1.malloc和free都是单纯的函数用申请内存和归还内存。 2.new包含了两个操作,第一个操作跟malloc类似,也是申请内存,第二个操作是对申请到的内存,也就是类A的示例对象,进行初始化,就是调用A的构造函数。至于delet 函数正好相反 3.无论是malloc还是new,它们都是可以被重载的。(默认情况下这二者都是从堆区申请内存的。)
相关文章
- android flag_activity_new_task结束,怎样避免使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TA
- 跟着NatureMetabolism学作图:R语言ggplot2转录组差异表达火山图
- Linux内核版本差异深度探索(linux内核版本区别)
- CCPA vs. GDPR:欧美这两部个人数据保护法有什么差异?
- Linux系统之旅:探究不同分支之间的差异(linux的分支)
- 之间的差异深入比较:ZLinux与Linux的差异(zlinux与linux)
- 解析Linux动态库与静态链接的差异(linux动态库静态链接)
- Oracle数据比对:帮助您解决数据差异问题(比对数据oracle)
- 温热备份与冷备份Oracle数据库的差异(oracle冷备份区别)
- Oracle中最佳查询快速获取分数的差异(Oracle中查询分数差)
- Oracle两个库表比对分析差异结果(oracle两个库表比对)
- Oracle两个字段的差异(oracle两个字段相减)
- Redis读写性能差异如何优化(redis读写性能差异)
- [图]英特尔Alder Lake支持DDR4/DDR5:初期对比结果显示差异不大