因为看完汇编语言一书后,对C语言的理解更深了一个层次。以及平时用java的架构开发web,对java的内存问题也有一定的了解。因此特地的写一篇关于内存的博客。仅提供给自己看,以及不是大神而是与我一般水平的人员阅读。
汇编的内存分配
以8086CPU为例子(我也只学过8086的),可以由自己分配数据段,以及任何一个内存单元都可以作为数据对的存储。而在内存单元中的数值分别代表的是指令或者是数据。二者必居其一,不可量不可也!
C/C++内存分配
C/C++分配内存空间分为三种,一种是用栈的内存空间,一种是用堆的内存空间,还有一个是静态存储区。
三者的区别是在于:
- 栈内存:由于栈的空间比较小,所以访问速度快(栈空间也是用我们的RAM空间)
- 堆内存:RAM中任意一块内存空间被占用(一般在new的时候会这样)
- 静态存储区:一般是在编译和预编译的时候指定的固定内存空间,所以访问速度是最快的
一般情况下,C/C++的在定义静态的变量和方法的时候会将它们存储到静态存储区中;在定义全局变量以及局部变量的时候将它们存储到栈内存中;当使用new的时候将它们存储在堆内存而将这个引用的地址存储在栈中。
JAVA内存分配
JAVA分配内存空间也是三种,堆栈,堆,静态存储区。
三者的区别:
- 堆栈:存储着对象的引用(地址)
- 堆:是new出来的(也只能是这样)
- 静态存储区:与C/C++一样
最后垃圾回收器根据引用计数器等一系列回收方式将没有存在引用的对象销毁。
方法区
没错,这3种语言都是存储方法的首地址。访问方法的首地址来执行相应的方法。
主函数
对汇编而言,主函数不一定要为main,而是CS、IP开始执行的位置。C/C++还有JAVA在一般(也就是约定俗成的情况下)主函数的入口就是main。
对于main方法而言,它其实也是一个方法的首地址(入口地址)。
反思想
我们可以通过对C/C++的重写构造,使之成为一个让人"看不懂"而功能又是一样的程序。因为变量就是地址,而方法也是首地址。完全可以通过改变地址去调用任何你想调用的方法。也就是说,如果同时运行两个程序,你知道其中一个程序中的子程序的首地址,那你完全可以C语音编程调用这个子程序。因为它们都只是内存地址而已。
结尾
以上都是自己的猜想。