- 论坛徽章:
- 0
|
原帖由 whyglinux 于 2007-5-23 20:38 发表 ![]()
首先,i 是一个自动变量,所以它的存储空间是自动分配的,而不是动态分配的(当然,也不是静态分配的)。
其次,你问的这个问题涉及到具体实现,而对同一段程序可能有多种实现方式,所以很难给出一个准确的答案。另外,“在物理上存在”的具体含义也值得商榷。
自动变量一般对应着进程的栈空间。在具体实现中多以函数为单位使用栈,也就是说:在编译的时候已经根据自动变量的数量和类型确定出了函数需要的栈空间,并确定了变量在此空间中的相对地址(或相对偏移)。这样,当程序执行到函数的时候,函数使用的栈空间已经被保留,相应地,自动变量的地址被确定。从这个意义上来说,似乎我们可以说这个变量在执行到函数的时候物理上已经存在了。
自动变量对应的栈空间也可能被同一函数中定义在不同块中的变量使用,所以物理上存在不意味着逻辑上也存在。
如果程序以块为单位组织栈,是不是我们就可以说只有进入变量作用域之后在物理上才存在?
自动变量 i 也有可能被编译器设置为寄存器变量。寄存器是始终存在的,那么这个自动变量什么时候在物理上存在?是进入作用域的时候、进入函数的时候、程序开始执行的时候、甚至程序尚未执行就已经存在了?
这句话没有明白什么意思。作者可以给解释一下什么情况会有这种情况呢?是比如- int
- example(void)
- {
- if (1) {
- int x;
- }
- if (1) {
- int x;
- }
- if (1) {
- int x;
- }
- } 这样的形式?
复制代码 我印象里,所见到的编译器 gcc,xlc,HP-UX上的c编译器,编译出来,x都不会用同一个地址。不知道原作者这句话具体体现的例子
可能是什么样子的。 |
|