对比常量存储与堆栈

简介: 翻译人员: 铁锚 翻译时间: 2013年12月3日 原文链接: Static Storage vs Heap vs Stack 下面是对编译器内存分配的总结: 1. 静态分配 vs 动态分配 静态分配: 编译器只依赖于程序代码中的字面量就可以进行分配的部分。

翻译人员: 铁锚

翻译时间: 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 运行时数据区

目录
相关文章
|
6月前
|
存储 C语言
局部变量的储存区别
局部变量的储存区别
52 0
|
6月前
|
C++
vs中变量内存怎么看
vs中变量内存怎么看
|
存储 机器学习/深度学习
浮点数在内存中的存储以及用指针改变内存与强制转换的区别
浮点数在内存中的存储以及用指针改变内存与强制转换的区别
|
存储 Linux C语言
C语言中变量在内存中的保存与访问
C语言中变量在内存中的保存与访问
|
Java
哪种JAVA的变量表达式使得变量a和变量b具有相同的内存引用地址????
哪种JAVA的变量表达式使得变量a和变量b具有相同的内存引用地址????
120 0
|
C语言
【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
144 0
【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
|
C语言
【C 语言】变量本质 ( 变量修改 | 直接修改变量 | 通过内存地址间接修改变量 | 通过指针间接修改变量 )
【C 语言】变量本质 ( 变量修改 | 直接修改变量 | 通过内存地址间接修改变量 | 通过指针间接修改变量 )
240 0
【C 语言】变量本质 ( 变量修改 | 直接修改变量 | 通过内存地址间接修改变量 | 通过指针间接修改变量 )
|
JavaScript Java Python