Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1018064
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-12-06 14:41:54

在Win32环境下,可以使用多种方式来分配/使用/释放动态内存,这些方式包括:

1. Win32 API:VirtualAlloc (),HeapAlloc (),LocalAlloc(),GlobalAlloc()。

2. C:malloc(),free()。

3. C++:new,delete。

VirtualAlloc ()是Windows系统提供的最"核心"的对虚拟内存操作的接口,也是其他几种内存分配方式的基础,它是几种方式中最通用的,也是功能最强大的。VirtualAlloc()用来分配一定范围的虚拟页。VirtualAlloc一次分配1PAGE以上的RAM,每次分配都是PAGE的整数倍。

HeapAlloc()用来从堆中分配一定数量的空间,HeapAlloc分配的内存是不能移动的。

LocalAlloc,GlobalAlloc是Win16 API中遗留下来的两个函数,Win32 API为了保持兼容性才包含了这两个函数。这两个函数内部是通过HeapAlloc()的一系列函数来操作一个"特殊"的Heap对象(进程的默认堆对象)。每一个进程在初始化的时候,都会创建一个默认的Heap对象,在进程结束的时候销毁这个默认的Heap对象。LocalAlloc和GblobalAlloc的区别仅表现在Win16环境下,在Win16环境下,内存的地址是通过段:段内偏移量来获取的,LocalAlloc()只能在同一段内分配内存,而GlobalAlloc可以跨越段边界访问内存。 在Win32环境下内存访问不存在这样的限制,表现出相同的功能。由于HeapAlloc()的一系列函数完全可以实现他们两个的功能,所以在Win32下不推荐使用这两个函数。

malloc(),free()是使用频率最高的两个函数他们是标准C库中的一部分,所以具有极高的移植性。在Windows平台下malloc()和free()是通过调用HeapAlloc()的一系列函数实现的。C语言的标准内存分配函数:malloc,calloc,realloc,free等。malloc(size)在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。ccalloc(n,size)在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。realloc(*ptr,size):将ptr内存大小增大到size。Free(ptr):释放ptr所指向的一块内存空间。

new,delete是C++内置的关键词(keyword)。当C++编译器看到关键词new的时候,编译器会执行以下两个任务:1,在堆上动态分配必要的内存。这个任务是由编译器提供的一个全局函数void* ::operator new(size_t)来完成的。2,调用CMyClass的构造函数来初始化刚刚生成的对象。new的具体实现是通过调用malloc来分配内存的。

总之,VirtualAlloc分配的是虚拟内存,HeapAlloc,malloc,new分配的是物理内存,是在堆上分配的。malloc,new的作用相同,都是调用了HeapAlloc函数。LocalAlloc,GlobalAlloc最好不要再用。

另外,使用VirtualAlloc分配的指针在sse2优化时可以直接赋值,或者用_mm_malloc()16字节对齐,但后者稍微慢些。使用new分配的内存不一定是16字节对齐的。

阅读(1967) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~