首页 > 代码库 > 内存管理

内存管理

python: 查看内存地址。

1 a=12 print a3 #输出物理内存地址 4 print id(a) 5 #输出物理内存地址(十六进制)6 print hex(id(a))
View Code

内存基础(C语言):

一个程序就是一个进程。

堆、栈、全局/静态存储区和常量存储区。

什么是常量,全局变量,局部变量和全局静态变量?

答:常量:不可更改的,一般用const 或者 define 修饰.

  全局变量:一般用 global 修饰,在函数体外定义的变量,在总个项目有效。

  局部变量:在函数体内定义的变量,在函数体内有效。

  全局静态变量:一般用 static修饰,在本文件内有效,只初始化一次,下一次结果依赖这一次的数据。

全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,

局部变量存放在内存的栈区。系统会自动释放。

静态存储区,意识就是说程序编译时调用时就已经分配好的内存。进程只要存在就不会被释放。

一般函数对象和结构分配到内存的堆区。一般由程序员手动释放。

 

在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象

 1 #is 判断对象内存是否相等 2 # True 3 a = 1 4 b = 1 5 print(a is b) 6 print(id(a),id(b)) 7  8 # True 9 a = "good"10 b = "good"11 print(a is b)12 print(id(a),id(b))13 # True14 a = "very good morning"15 b = "very good morning"16 print(a is b)17 print(id(a),id(b))18 # False19 a = []20 b = []21 print(a is b)22 print(id(a),id(b))
View Code

在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。

我们可以使用sys包中的getrefcount(),来查看某个对象的引用计数。需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。

1 from sys import getrefcount2 3 a = [1, 2, 3]4 print(getrefcount(a))5 6 b = a7 print(getrefcount(b))
View Code