无OS时,RAM的使用可以分为数据、栈和堆区域;有OS时,将RAM分成若干个段,每个任务分配一个段,用于各自的数据、栈和堆区域。
局部变量(Local Variable)是指作用域和生命周期都局限在所在函数或过程范围内的变量,它是相对于全局变量(Global variable)而言的。
编译器在为局部变量分配空间时通常有两种做法:使用寄存器和使用栈。寄存器的访问速度快,但数量和空间有限,所以像字符串或数组不适合分配在寄存器中。编译器通常只会把频繁使用的临时变量分配在寄存器中,比如for循环中的循环变量。
栈上的变量会随着函数的调用和返回而自动分配和释放,所以栈有时也称为自动内存。编译器在编译时,会计算当前的代码块中所声明的所有局部变量所需要的空间,并将其按照内存对齐要求来分配3,一般为4字节对齐。
X86 CPU中定义了栈指针ESP(栈顶)寄存器,和栈基址指针EBP(栈底)寄存器,使用EBP寄存器,函数可以把自己将要使用的栈空间的基准地址记录下来,然后使用这个基地址来引用局部变量和参数。在同一函数内,EBP寄存器的值是保持不变的,这样函数的局部变量就有了一个固定的参照物。
通常,一个函数在入口处将当时的EBP值压入堆栈1,然后把ESP值(栈顶)赋值给EBP2,这样EBP中的地址就是进入本函数时的栈顶地址。
每个函数在栈中所使用的区域称为一个栈帧(stack frame),每发生一次函数调用,便产生一个新的栈帧,当一个函数返回时,这个函数所对应的栈帧被清除。