0%

python c java 的变量、堆、栈

背景知识

  • : 是向低地址扩展的数据结构,是一块连续的内存区域。 栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M (也有的说是 1M ,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow 。因此,能从栈获得的空间较小。
    • 由系统自动分配,速度较快。但程序员是无法控制的
  • :是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
    • 堆是由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片 , 不过用起来最方便 。
  • 变量
  • 二进制存储,数值在内存中的表示

many languages have “variables”

计算机内存就像是很多盒子的集合体,每个盒子都有地址。
在很多语言中,给变量赋值可以理解成把value放入盒子,比如:

int a = 1;
a = 2;

只是替换了盒子里的内容。

int b = a;

C - 面向过程

  1. 运行时,首先系统为整个函数栈预分配空间(一块连续的内存区域),栈上存储该函数的局部变量。即变量a对应固定的盒子(地址)。
  2. 执行 int a = 1 即把数值1放入a对应的盒子
  3. 执行 a = 2 替换了a盒子里的内容

C++ - 半面向对象

Java 不完全 面向对象

  1. Java中的原始类型 primitive type,与C语言类似,变量对应盒子
  2. 运行 int a = 1,存储在栈中
  3. 运行 a = 2
  4. class,与python类似,变量
  5. 运行 Integer b = 1,存储在栈中还是堆中?貌似有个Integer池,预分配好的。
  6. 运行 Integer c = 1000,会new 一个Integer Object,并存储在堆中

疑问

  • java不预分配函数栈空间吗?
  • java中为什么是frames和objects?为什么不是stack heap?
  • java中的原始类型,与class类型

python - 面向对象

Other languages have “variables”, python has “names”. — David Goodger

  1. python中一切皆对象,a=1aPyIntObject的对象,存储在堆中
  2. python has “names”,指的是python的变量都是代号(盒子中存的是地址,而不是value)。
  3. a=2,是把a指向了对象2

疑问

  • python中是frame的概念,不是stack。why?

javascript

扩展阅读

  • Code Like a Pythonista: Idiomatic Python | David Goodger
  • http://pythontutor.com
  • Python References vs C and C++