总述:
这里是例举的Java当中的例子,其他语言如:C/C++(多一个指针)。但是基本的存储方式都是一样的,生命周期也是差不多的。这是我学了一年多的计算机的一点感悟,也是从翻阅其他书籍、和其他大神的博客得到的一些总结。
好多博客知识对引用做了很简单的区分(按值传递、按址传递),但是他们并没有考虑到程序运行时的机制,以及数据变量在内存中的分配。函数是在栈中运行的,所有要遵循栈的保护机制。入栈要进行参数的现场保护,出栈要进行现场恢复,所以传入的参数(引用)就会恢复原始状态,本质上,除了原始类型值按值(因为原始类型存储在代码块中)传递之外,对象都是引用(按地址)传递,只是因为栈的机制、以及数据的存储区域、声明周期的不同;所以才会有
对参数改变的生效或者无效之说(也就是按值和按址)。
这里做了一单i简单的归纳,我想说的更清楚一些,但是表达能力有限。
1.说明:
其实,不管是哪种语言,大概的数据存储、分配方式都是遵循一些基本的原理的。因为这里是以Java的源代码作为示例的,因此就拿Java里面的数据作为说明对象。
2.概念:
2.1、要点:
(1).程序(主要指函数)执行时,执行顺序是按照栈的方式。程序入栈的时候,其传入的参数要进行“现场保护”,函数执行完毕,出栈的时候要对参数进行“现场恢 复”。
基于这样的机制来保护原有参数不受影响,程序得以按照原先的状态继续执行。
(2)栈:后进先出
堆:顺序随意
2.2、预备知识
在Java中,程序中分为6个存储区域来存放程序中的变量以及代码占用的内存。
(1)寄存器(register):这是最快的存储区,因为它位于CPU的内部。数量有限,而且不能被我们直接控制,由系统进行控制。一般感觉不到。(C /C++里面可以声明)
(2)栈(stack):位于通用RAM中,通过它的“栈指针”可以从处理器那里直接获得。栈指针若向下移动则分配新的内存;若向上移动则释放那些跳过的内存。这是一种
快速的分配方法,仅次于寄存器。操作方式类似于数据结构当中的栈,实际中的栈是由系统调用的。
(3)堆(heap):一种通用性的内存池,存放所有Java中的对象(因为Java对象都是new出来的)。而且,编译器不需要知道要从堆了分配多少存储区域,也不必要
知道存储的数据在堆里活动多长时间。由程序员创建,由程序员释放(若程序员不释放,Java系统会自动释放,但C/C++就不会)。但是,这种方式
的存储需要的时间也比栈较久。
(4)全局区(静态区):这个区存放着全局变量和静态变量。里面存放着程序运行时一直存在的数据。比如说直接在源文件里面声明的类(没有嵌入在其他类中)的
类就是存放在全局区里,以及用static声明的变量和函数也是存放在这个区