学习一门语言往往需要从最简单的词汇说起。在C家族的语言背景下,对于内存、指针的自由支配一直都是语言的优势所在。
为此,C与C++都提出了自己特色的函数与关键字,那就是malloc和new
异同
相同点:
1.都会申请内存
不同点:
1.malloc是函数,而new是关键字
2.malloc返回一个指针,指向被分配的内存;new返回一个有类型的对象
3.malloc仅仅申请内存,而new还会执行构造
4.new含有new handle机制,而malloc没有
原理
我们先来看一看new吧,C++中的new可以被分为两个部分,一个是opreater new一个是placement new。就是一个负责分配内存,一个负责执行构造。
而C++中构造可能出现的乱序执行问题,也可以通过拆分这两个步骤的方式来避免。
前面说到分配内存的函数是opreater new,也就是和malloc是一个功能。
那malloc又是怎么实现的呢?
要回答这个问题,首先,我们需要了解一下基本的程序内存结构。
承接上文,malloc他是一个函数,即存在于.text中存在。但是,他是一个系统函数,也就是说,他可能存在于kernel的.text中。
它的内存申请是先在VP中申请并建立一个条目,此时程序并未真正的分配内存。
知道程序第一次引用这个条目,CPU发出VA指令,将指令交给MMU,会在TLB中或者直接在PTE中寻找对应的条目。找到之后执行。
假设需要执行的内存没有被找到,就会触发一个缺页。
我们会在dram中找到一个牺牲页,将需要的数据写进牺牲页中。
Q.E.D.