zoukankan      html  css  js  c++  java
  • 在Windows中,系统为大家提供了很多种内存的分配方式,包括new,malloc(),HeapAlloc(),VirtualAlloc()等,那么它们的区别是什么呢?彼此有没有联系呢?下面对此来做个比较和总结。

    (1)new是C++的运算符,操作的是默认堆,具备编译器可控制的操作,可以完成C++类对象的构造,适合小型数据的内存分配,操作简单方便。

    (2)malloc是c提供的库函数,操作的是默认堆,适合小型数据的内存分配,操作简单方便。

    (3)HeapAlloc操作的是默认的堆或自定义堆,效率高,适合小型数据或中型数据内存分配

    (4)VirtualAlloc()操作的是虚拟内存,适合大型数据的内存分配。

    new、malloc、HeapAlloc()所操作的堆都是虚拟内存的一部分,编译器或程序无法分辨当前分配的空间是物理内存还是在磁盘页文件中。在Windows系统中,程序在应用层调用malloc()和new来分配内存,系统最终都会调用VirtualAlloc()函数。但是malloc()和new不是直接调用它。malloc()首先调用HeapAlloc(),然后HeapAlloc()调用VirtualAlloc().HeapAlloc()就是在自己已经分配好的内存上修改自己的属性。如果HeapAlloc()失败了,那么malloc()会调用HeapCreate(),重新建一个堆。HeapCreate()首先调用VirtualAlloc()分配一个比较大的内存,这个大小是malloc()函数决定的,比如代码中malloc(200),那么HeapCreate()最少会分出4096字节出来,因为4096正式i386机器的内存页的大小,并且把这4096字节都设置成不可访问。HeapCreate()后,malloc又去调用一次HeapAlloc(),也就是从这4096字节大小中划出200字节可访问的内存。

    C++中new运算符除了调用malloc()来分配内存外,还对分配的内存调用了C++类的构造函数进行初始化。

    所以,内存分配函数的顺序是:new->malloc->HeapAlloc()->VirtualAlloc()->驱动程序的_PageAlloc();

  • 相关阅读:
    xcode5.1上真机调试报告No architectures to compile for...的解决办法
    Altium Designer元件库--多单元元器件的制作
    COMS门电路的设计及其优化--以异或门为例
    从器件物理层面看MOSFET的内部结构
    VHDL与Verilog硬件描述语言TestBench的编写
    C语言求解Excel地址转换问题
    数字黑洞求解问题
    计算机显示电池出现问题
    Charles安装
    滑动窗口1——无重复字符的最长字串
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2957062.html
Copyright © 2011-2022 走看看