Manual Memory Management

1. C语言操作

1.1 概述

C语言内存管理分statically,automatically,dynamically三种方式;static变量配置在main memory,一般在整个程序都有效;auto变量配置在stack,在包含该变量的function调用时起作用,返回时结束;对static和auto变量的大小在编译期就需要确定。
配置内存的生命时间也会造成一些问题,static和auto不能满足所有的情况,auto不能让多个functions调用,同时static在程序的整个过程都存在,无论是否需要,所以我们需要更灵活的内存申请和消除。
动态内存配置可以解决上述问题,可以更灵活的管理内存,从堆-heap上申请内存;在C中使用malloc/calloc从heap上申请内存,程序通过返回的指针访问该段内存。当此内存不再需要时,通过free消除。
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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值