引言
对于值类型来说,一般创建在线程的堆栈上。但并非所有的值类型都创建在线程的堆栈上,例如作为
类的字段时,值类型作为实例成员的一部分也被创建在托管堆上;装箱发生时,值类型字段也会拷贝在托
管堆上。
对于分配在堆栈上的局部变量来说,操作系统维护着一个堆栈指针来指向下一个自由空间的地址,并
且堆栈的内存地址是由高位到低位向下填充。以下例而言:
public static void Main()
{
int x = 100;
char c = 'A';
}
假设线程栈的初始化地址为 50000,因此堆栈指针首先指向 50000 地址空间。代码由入口函数 M
ain 开始执行,首先进入作用域的是整型局部变量 x,它将在栈上分配 4Byte 的内存空间,因此堆栈指针
向下移动 4 个字节,则值 100 将保存在 49997~50000 单位,而堆栈指针表示的下一个自由空间地址为
49996,如图所示:
接着进入下一行代码,将为字符型变量 c 分配 2Byte 的内存空间,堆栈指针向下移动 2 个字节至 49
994 单位,值’A’会保存在 49995~49996 单位,地址的分配如图:
最后,执行到 Main 方法的右括号,方法体执行结束,变量 x 和 c 的作用域也随之结束,需
要删除变量 x 和 c 在堆栈内存中的值,其释放过程和分配过程刚好相反:首先删除 c 的内存,堆
栈指针向上递增 2 个字节,然后删除 x 的内存,堆栈指针继续向上递增 4 个字节,程序执行结
束,此时的内存状况为:
其他较复杂的分配过程,可能在作用域和分配大小上有所不同,但是基本过程大同小异。栈
上的内存分配,效率较高,但是内存容量不大,同时变量的生存周期随着方法的结束而消亡。