1. C语言操作
1.1 概述
malloc() can also avoid system calls by utilising fast bins
一些平台提供开发库,允许从 stack上配置实时动态内存,如alloca()。采取这种方式申请的内存在function结束时自动销毁。
C的动态内存配置函数定义在stdlib.h头文件,若需要在c++中使用请包含cstdlib.h。
Function | Description |
malloc | allocates the specified number of bytes |
realloc | increases or decreases the size of the specified block of memory. Reallocates it if needed |
calloc | allocates the specified number of bytes and initializes them to zero |
free | releases the specified block of memory back to the system |
1.2 比较malloc()和calloc()
1. malloc()仅接收一个参数,即配置内存的字节数量;calloc()需要两个参数,即配置内存的变量单位数量,和变量单位的字节大小。2. malloc()不初始化配置的内存,calloc()初始化配置的所有内存为0;
1.3 例子
//malloc()
int * array;
if ( NULL == (array = malloc(10 * sizeof(int))) ) {
printf("malloc failed\n");
return(-1);
}
//calloc()
int * array = calloc(10, sizeof (int));
上述配置内存方式,不安全,使用了隐式的类型转换,推荐使用下述的安全类型转换
int * ptr;
ptr = (int *)malloc(10 * sizeof(int)); /* with a cast */
ptr = reinterpret_cast<int *>(malloc(10 * sizeof(int))); /* with a cast, for C++ */
2. Stack(栈)和Heap(堆)分析
进程中每个线程都有自己的堆栈,这是一段线程创建时保留下的地址区域。我们的“栈内存”即在此。至于“堆”内存,我个人认为在未用new定义时,堆应该就是未“保留”未“提交”的自由空间,new的功能是在这些自由空间中保留(并提交)出一个地址范围。
栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。
堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/new请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多。
在Java中除了简单类型(int,char等)都是在堆-Heap中分配内存,这也是程序慢的一个主要原因。但是跟C/C++不同,Java中分配堆-Heap内存是自动初始化的。在Java中所有的对象(包括int的wrapper Integer)都是在堆-Heap中分配的,但是这个对象的引用却是在栈-Stack中分配。也就是说在建立一个对象时从两个地方都分配内存,在堆-Heap中分配的内存实际建立这个对象,而在栈-Stack中分配的内存只是一个指向这个堆-Heap对象的指针(引用)而已。堆-Heap是指程序运行是申请的动态内存,而栈-Stack只是指一种使用堆的方法(即先进后出)。栈-Stack是先进后出的,但是对于堆-Heap而言却没有这个特性,两者都是存放临时数据的地方。 对于堆-Heap,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。
因为总是将堆栈两个字分不清,所以自己还是比较喜欢用Stack和Heap进行记忆理解,专有名词基本不需要翻译了。
参考
【1】 C dynamic memory allocation
【2】 Memory Allocation