栈与堆的超基础知识
来源:互联网 发布:高台家的成员们网络剧 编辑:程序博客网 时间:2024/06/06 07:31
整体性很强,但一般较小,不易存储大文件,不易产生碎片。
2.堆区的大小一般由程序员决定,并且向系统申请,在 程序运行结束之后,程序员必须释放内存出来,不然可能造成内存泄漏。
3.寄存器区:用保存指针的地区(待补充),处于内存阶层的最顶端,系统获得操作资料的最快速途径。
4.全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,该区域共分为两块,初始化
的全局变量与静态变量放在一起,未初始化的全局变量与静态变量存放在一起。
5.文字常量区:常量字符串就是放在这里的,程序结束后由系统释放(字符串常量是一对双引号括起来的字符序列。)
6.程序代码区:存放函数体的二进制代码。
7.函数参数和局部变量存放在栈中,当函数运行结束并且返回时,所有的局部变量
和参数都会被系统自动清除掉,目的是释放掉被他们所占用的内存空间。(栈中数据寿命短)
8.全局变量存储于静态区,而且永远不会被释放,但是全局变量被所有的类成员和函数所共享,
所以全局变量的值很容易被修改,使用起来颇多隐患。(全局区全局变量数据不安全)(使用堆可以解决7,8条)
9.关于栈与堆的内存申请方式:
栈里面的内存申请,栈内数据所需要占用的内存是系统自己分配的,但是需要程序员提前替数据做出声明,例如(int a),然后
系统会自动在栈内为变量a开劈出一段内存给变量a;
堆里面的内存申请:程序员需要用new等语句向堆申请内存空间,并且用delte释放内存空间。
10.系统响应的不同
栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将会提示overflow,即栈溢出。
堆:系统收到程序中申请空间的要求后,会遍历一遍操作系统中,用于记录内存空闲地址的链表,
当找到一个空间大于所申请空间的堆结点后,就会将该结点从空闲地址链表列表中删除,并将
该结点的内存分配给程序,然后在这块内存区域的首地址处记录分配的大小,这样我们在
使用deleted来释放内存的时候,delete才能正确的识别并删除该内存区域的所有变量。
(我们申请的内存空间与堆结点上的内存空间不一定相等,这时系统会自动将堆结点上
多出来的那一部分内存空间回收到空闲链表中。)
1.栈与堆空间大小的不同
栈是一块连续的内存区域,它的大小是2m或1m(栈的大小是由编译器来管理的,一般是1m或2m,也可以
自己手动设置,其具体的大小可能根据编译器的不同而异,但我们可以不用指望栈能存储比较大的数据)
堆内存是向系统申请当的内存,由程序员管理的,new或者malloc时系统正常情况下会给你一块堆内存空
间(该内存空间由链表将各个不连续的内存区域连接起来,这些串联起来的内存空间叫做堆),堆想什么时候存数据,想什么时候释放(delete,free)都可以,堆的大小没有什么具体数值
。看机器的运行状况,配置状况而定。它的上限由系统中有效的虚拟内存来定,因此获得的空间比较大
而且获得空间的方式也比较灵活。
2.栈与堆执行效率的不同
栈由系统自动分配,因此速度比较快,但是程序员不能对其进行操作。
堆由程序员分配内存,一般速度比较慢,而且容易产生内存碎片,不过用起来很方便。
3.执行函数时的不同
栈:函数调用时,第一个进栈的是被调用函数下一行的内存地址,其次是函数的参数,假如参数多于一个,次序是从右到左,
最后是函数的局部变量。
由于栈的先进后出原则,函数结束时正好与其相反,首先是局部变量先出栈,然后是参数,次序是从
左到右,这时所有的变量都已出栈,指针自然地知道第一个进栈的那行内存地址,也是被调用函数的
下一行内存地址,程序根据该地址跳转到·被调用函数的下一行自动进行。
堆:堆是由一大堆不连续的内存区域,在系统中由链表将它们串接起来,因此在使用的时候必须
由程序员来安排。它的机制很复杂,有时为了分配一块合适的内存,程序员需要按照一定的
算法在堆内存中搜索可用的足够大小的空间,如果没有满足条件的空间,那么就要向系统发出
申请增加一部分内存空间。(可以存储大的数据,灵活性强,但是运行效率较低,极易产生内存碎片,)
//一般而言,小的数据一般都是用栈来存储的。
4:为了数据隐秘起见,堆中的每个每个内存单元都是匿名的,必须先在堆中申请一个内存单元的
地址,然后将该地址保存在指针中,这样就可以使用指针来访问该内存单元的数据(用特定的指针来存储函数地址,一来
可以保证数据安全,不会被乱修改,二是可以提高效率)
5:栈的内存单元中的数据不是匿名的,程序员可以为他们命名,因此运行效率高。
每日一句英语:Give every day the chance to become the most beautiful day of your life.
- 栈与堆的超基础知识
- 堆与栈的区别-----超详细总结
- 【超清晰详细】堆与栈的区别 | Java 基础
- 内存有关的基础知识(堆与栈)
- Net堆与栈的区别(1)基础知识 值类型与引用类型
- 堆的基础知识
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- 栈 与 堆 的区别
- 堆与栈的区别
- 栈与堆的区别
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- Java的堆与栈
- 关于ads的license安装问题
- 关于array与&array的区别说明
- java hashMap 简单使用以及深度分析
- xx is not in the sudoers file 问题解决【转载】
- UVA 10858
- 栈与堆的超基础知识
- ANT-build.xml编译文件详解
- Struts2与Struts1的区别
- oracle用户复效
- 经典SQL语句大全(技巧)
- 关于IO
- wftcujln第一页章
- Hibernate配置
- vb.net 接口