对比常量存储与堆栈

翻译人员: 铁锚

翻译时间: 2013年12月3日

原文链接: Static Storage vs Heap vs Stack

下面是对编译器内存分配的总结:

1. 静态分配 vs 动态分配

静态分配: 编译器只依赖于程序代码中的字面量就可以进行分配的部分。静态分配尽可能多地分配数据对象,原因之一是这些对象的地址可以编译成目标代码。

动态分配: 在程序运行过程中代码执行到特定位置才可以进行分配。

2. 静态分配(Static)

全局常量以及其他由编译器生成的数据(例如 为垃圾回收而生成的信息)是属于静态分配的。静态变量在代码执行之前绑定到内存单元,并且在整个程序执行过程中都指向相同的内存单元.例如: C的静态变量

优点: 高效(直接寻址),支持子程序访问中间结果(history-sensitive).

缺点: 缺乏灵活性, 就如 Fortran一样,如果这是唯一的变量则不能循环利用.(no recursion if this is the *only* kind of variable)

3. 堆

如果数据对象比创建自身的函数(方法)的生命周期更长,则通常分配在堆内存(Heap)中,例如: 从一个过程传递到另一个过程的对象可以通过new来创建.

堆内存的大小在编译时没有确定,只可以通过指针或者引用来使用这些对象,例如: C++中的 动态对象(dynamic objects),以及Java中的所有对象.

优点提供了动态存储管理.

缺点: 效率相对较低,有时会出现各种可靠性问题.

4. 栈

方法/过程内部的局部变量分配在栈(Stack)上, 栈的大小才编译期也是不能确定的。

优点:

允许循环利用(allows recursion)

节约内存空间(conserves storage)

缺点:

分配和重分配的开销
子程序对历史数据不敏感(一般不能访问中间结果)
低效的引用(间接寻址)

  1. Java 数组在内存中的结构
  2. How Java Compiler Generate Code for Overloaded and Overridden Methods?
  3. Java 对象在堆中的内存结构
  4. JVM 运行时数据区

posted on   岚之山  阅读(197)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示