6.new 和 malloc 的区别-灵析社区

菜鸟码转

1.malloc 的实现原理:

malloc 为 C 语言的库函数,主要用来从堆中申请指定大小且连续的内存空间。实际的底层实现可能较为复杂,每个程序都带有自己的动态内存管理子模块,常见的动态内存分配算法有 best fit 和 first fit 等。由于现代操作系统用户程序都是采用虚拟地址空间,理论上对于一个程序来说,在 64 位地址空间下,它可见的地址空间为 0x0000000000000000-0xFFFFFFFFFFFFFFF,而程序中的 heap 段是虚拟地址中的一段连续的空间。程序运行时,操作系统会预先为程序分配 heap 段,虽然程序的运行,使用的 heap 空间不断增大,当操作系统已分配的空间不够使用时,这时会通过 mmap 映射新的物理内存页加入到 heap 空间中,并将新加入的物理页映射到 heap 的末尾,从而形成连续的虚拟内存空间。

2.new 与 malloc 的区别:

  • new 在申请内存的同时,会调用对象的构造函数,对象会进行初始化,malloc 仅仅在堆中申请一块指定大小的内存空间,并不会对内存和对象进行初始化。
  • new 可以指定内存空间初始化对象,而 malloc 只能从堆中申请内存。
  • new 是 c++ 中的一个操作符,而 malloc 是 C 中的一个函数。
  • new 的返回值为一个对象的指针类型,而 malloc 统一返回 void * 指针。
  • new 内存分配成功,返回该对象类型的指针,分配失败,抛出 bad_alloc 异常;而 malloc 成功申请到内存,返回指向该内存的指针;分配失败,返回 NULL 指针。
  • new 的空间大小由编译器会自动计算,而 malloc 则需要指定空间大小。
  • new 作为一个运算符可以进行重载,而 malloc 作为一个函数不支持重载。
  • malloc 可以更改申请过的空间大小,我们可以 realloc 指定空间大小,而 new 一旦申请则无法更改。

阅读量:2012

点赞量:0

收藏量:0