堆栈的区别

来源:互联网 发布:js日程管理插件 编辑:程序博客网 时间:2024/06/03 23:03

堆栈一直傻傻分不清。在参考了大多数资料后有必要为自己保留一下,以防忘记。大一时候自认为了解得还挺清楚,没想到前个星期笔试就跪在这类题上了。

不同点:

管理方式:对于栈来讲,由编译器自动管理,无需程序员手工控制,而对于堆来讲则需要程序员申请及释放。

空间大小:栈的空间一般较小,但是可以再编译器中修改,而堆的空间相对较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,产生大量的碎片

生长方向:堆:向内存增大的方向生长,而栈向内存减小的方向生长

分配方式:堆为动态分配,而栈有静态分配及动态分配两种,静态分配由编译器自动完成,如局部变量的分配,而动态分配由alloca函数完成。注意栈的动态分配与堆的动态分配时不同的,他的动态分配由编译器进行释放。

使用效率:堆的效率比栈低,压栈出栈有专门的指令进行执行,这决定了栈的效率比堆高,当堆需要申请内存时,需要在堆内存中进行搜索合适的空间。


例子:

int *p = new int[5];

申请了一块堆内存,而指针p则为一块栈内存,这句话的意思就是在栈内存中存放了一个指向一块堆内存的指针P

堆栈一般指堆。。


malloc/free 及new/delete的区别:

eg:

int * p = (int *)malloc(sizeof(int));

int *p = new int[2];

malloc的返回值为void* 所以在使用时需进行显示的强制转换类型,malloc本身并不识别需要申请内存的类型,只关心大小

而new函数内置了类型检查,类型转换,sizeof等功能。用起来比较简单。

还有一个就是在使用delete数组指针时需要加入[],如:delete []p;


0 0