|
各位好:碰到一个问题感觉不是很明白,请教一下
在函数调用过程中,函数中的自动变量如果少的话,可以直接用寄存器实现,用到哪个寄存器,就要在函数头Push进来,函数尾巴Pop出去,这些是不是都靠编译器来把握了。
但是如果自动变量很多的情况,BLUELUCKY版主曾经提到过
“自动变量的情况有些特殊,它的创建操作,其实只是直接把寄存器拿来用(对于优化到寄存器中的自动变量),或者对SP进行减法操作以开出栈空间后,然后使用ldr rd, [sp, #+imm]之类的指令寻址。函数返回后,寄存器就另作它用,SP也调整回去,这就体现了自动变量生命期只在函数内的原则。”
可不可以这样理解
开辟内存的时候虽然修改的是SP的指针,但实际上对该新开出来的堆栈内存的访问都是通过LDR 和STR实现的(不涉及PUSH或者Pop),之所以用到了堆栈,是因为
使用堆栈空间存放自动变量在程序结束的时候可以通过修改SP值就达到释放内存空间的目的,比较方便,所以很多编译器采用堆栈来存储自动变量。
不知道这么理解对不对?
这么说C语言提供的动态分配空间的malloc()函数是不是也就是完成两个功能 1)修改SP(开出堆栈空间)2)堆栈空间赋值的功能
动态释放空间的free()函数是不是就是完成恢复SP的功能
感谢各位指导
aaa1982 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|