------- android培训 、 java培训 、期待与您交流! ----------
堆栈在语言开发中,很重要,但我对其一直不是非常理解,于是,仔细百度了一下,现将总结与感想记下,以备自己闲时再翻看一番。
首先,堆是堆,栈是栈,堆栈不是堆与栈,是运行时的栈。
1,堆:堆是存储在硬盘上的,栈:栈存放在内存上。
因为每次读取数据,栈里的数据是直接从内存读的,而堆里的数据,需要从硬盘读取到内存,所以,堆的速度不及栈的快。
2,堆的空间大,栈的小。
从一方面讲,堆是存在硬盘上,栈是在内存上,自然是堆的空间大,栈的空间小。从另一层名讲,堆是向高地址扩展,而栈是向低地址扩展(windows下,话说,我不知道其他系统下是什么情况,百度后再修改),栈的大小是一定的,而堆的大小是有限于计算机的虚拟内存,即硬盘大小,因此,堆的空间比栈要大很多。
3,堆存放的一般是对象,数组等,而栈存放的是变量,值。
c通过malloc申请堆空间,c++,java通过new创建对象,对象存放在堆里,而变量等,则存放在栈中,简单的说,就是对象,数组等占空间大的,存放在堆中,而像int a
= 3,等的值则存放在栈中,
- int a = 0; //全局初始化区
char *p1; //全局未初始化区
main() {
int b; //栈
char s[] = "abc "; //栈
char *p2; //栈
char *p3 = "123456 "; //123456/0在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char*)malloc(10);
- p2 = (char*)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456 "); //123456/0放在常量区,编译器可能会将它与p3所指向的 "123456 "优化成一个地方。
- } 这一段的代码很好,是位前辈写的,我copy来了,看着都觉得简单明了了很多。
4,堆是程序员操作释放的,而栈是系统回收的。
堆创建是要通过malloc,new等通知系统创建,结束时也要通过free等方法告诉系统释放空间。而栈是,系统自动回收的,如变量,当不在其作用范围的时候,便会被系统释放掉,这样有利于栈的空间管理。
堆栈还有其他一大堆,遇到了补上。
------- android培训、java培训、期待与您交流! ----------
详情请查看: