背景知识
- 栈: 是向
低地址扩展
的数据结构,是一块连续的内存区域
。 栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS 下,栈的大小是 2M (也有的说是 1M ,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow 。因此,能从栈获得的空间较小。- 由系统自动分配,速度较快。但程序员是无法控制的
- 堆:是向
高地址扩展
的数据结构,是不连续的内存区域
。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。- 堆是由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片 , 不过用起来最方便 。
- 变量
- 二进制存储,数值在内存中的表示
many languages have “variables”
计算机内存就像是很多盒子的集合体,每个盒子都有地址。
在很多语言中,给变量赋值可以理解成把value放入盒子,比如:
int a = 1; |
a = 2; |
只是替换了盒子里的内容。
int b = a; |
C - 面向过程
- 运行时,首先系统为整个
函数栈
预分配空间(一块连续的内存区域),栈上存储该函数的局部变量
。即变量a
对应固定的盒子(地址)。 - 执行
int a = 1
即把数值1
放入a
对应的盒子 - 执行
a = 2
替换了a
盒子里的内容
C++ - 半面向对象
Java 不完全 面向对象
- Java中的原始类型 primitive type,与C语言类似,变量对应盒子
- 运行
int a = 1
,存储在栈中 - 运行
a = 2
, - class,与python类似,变量
- 运行
Integer b = 1
,存储在栈中还是堆中?貌似有个Integer池,预分配好的。 - 运行
Integer c = 1000
,会new 一个Integer Object,并存储在堆中
疑问
- java不预分配函数栈空间吗?
- java中为什么是frames和objects?为什么不是stack heap?
- java中的原始类型,与class类型
python - 面向对象
Other languages have “variables”, python has “names”. — David Goodger
- python中一切皆对象,
a=1
,a
是PyIntObject
的对象,存储在堆中 - python has “names”,指的是python的变量都是代号(盒子中存的是地址,而不是value)。
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++