关于栈和局部变量的问题

早上看一篇文章联想起栈和局部变量的事情,虽然知道,但一直没有亲眼见到怎么回事

1.有时候编译器会优化掉变量(就像VHDL综合掉没有出口的信号和触发器)

11

 

2.编译器似乎提前知道判断条件结果

22

33

 

3.对于子函数,如果变量少于通用寄存器个数,变量就优化成寄存器

44

 

5.栈不仅用来保存PC返回值(就是“{”时加入的),子函数的变量也是放在栈里的

55

66

6.对于局部变量,编译器只不过用栈指针+偏移来寻址罢了,这也解释了为什么栈可以物理上不连续(新建线程的时候会传入栈指针,这个栈是新申请的内存)。

7.最初的栈指针是初始化库函数时建立的(就是在main函数之前的代码),不过这个时候应该是汇编设置的地址(ARM启动时会设置不同模式的SP),这个是所有栈的源头,至于以后的SP是多少当然是可以“自由”分配了。

8.在“{}”函数体的“{”时编译器会插入保存SP的代码,然后接着继续使用SP,在“}”的时候会弹栈。这是否意味着专门有个栈来保存栈指针SP呢?答案是不会:编译过程是会事先计算好地址的,所谓“弹栈”不过是SP=SP-offset罢了,然后把之前保存的PC什么的恢复。

9.第一个进程的栈和最初的那个栈物理上应该是连续的,以后的进程就不好说了

关于栈和局部变量的问题_第1张图片

你可能感兴趣的:(优化,汇编,编译器,联想)