Ran*_*ick 11
出于效率原因,C选择不将变量初始化为某个自动值.要初始化此数据,必须添加说明.这是一个例子:
int main(int argc, const char *argv[])
{
int x;
return x;
}
Run Code Online (Sandbox Code Playgroud)
产生:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl -4(%ebp), %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
虽然这段代码:
int main(int argc, const char *argv[])
{
int x=1;
return x;
}
Run Code Online (Sandbox Code Playgroud)
产生:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $1, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
如您所见,使用完整的额外指令将1移入x.这曾经很重要,在嵌入式系统上仍然如此.
垃圾值实际上并未存储在任何地方.实际上,就抽象语言而言,垃圾值并不存在.
您可以看到,为了生成最有效的代码,编译器根据对象(变量)的生命周期进行操作是不够的.为了生成最有效的代码,编译器必须在更精细的级别上运行:它必须根据值的生命周期 "思考" .例如,这对于执行CPU寄存器的有效调度是绝对必要的.
抽象语言没有"价值终身"这样的概念.但是,语言作者认识到该概念对优化编译器的重要性.为了给编译器足够的自由来执行有效的优化,有意地指定语言,以便它不会干扰重要的优化.这就是"垃圾价值"出现的地方.该语言并未声明垃圾值存储在任何地方,该语言不保证垃圾值是稳定的(即重复尝试读取相同的未初始化变量可能很容易导致不同的"垃圾值").这是专门为了让优化编译器实现"价值生命周期"的重要概念而完成的.
几年前,IIRC,Thompson或Richie接受了采访,他们说语言定义故意在某些地方使事情变得模糊,因此特定平台上的实施者有余地在该平台上做有意义的事情(周期,记忆等).对不起,我没有链接的参考.