存储垃圾值的位置和目的是什么?
答案 0 :(得分:11)
C出于效率原因选择不将变量初始化为某个自动值。要初始化此数据,必须添加说明。这是一个例子:
int main(int argc, const char *argv[])
{
int x;
return x;
}
产生
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl -4(%ebp), %eax
leave
ret
这段代码:
int main(int argc, const char *argv[])
{
int x=1;
return x;
}
产生
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $1, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
如您所见,使用完整的额外指令将1移入x。这曾经很重要,在嵌入式系统中仍然如此。
答案 1 :(得分:6)
垃圾值实际上并未存储在任何地方。实际上,就抽象语言而言,垃圾值并不存在。
您可以看到,为了生成最有效的代码,编译器根据对象的生命周期(变量)进行操作是不够的。为了生成最有效的代码,编译器必须在更精细的级别上运行:它必须根据值的生命周期“思考”。例如,这对于执行CPU寄存器的有效调度是绝对必要的。
抽象语言没有“价值终身”这样的概念。但是,语言作者认识到该概念对优化编译器的重要性。为了使编译器有足够的自由来执行有效的优化,有意地指定语言,以便它不会干扰重要的优化。这就是“垃圾价值”出现的地方。该语言没有说明垃圾值存储在任何地方,语言不保证垃圾值是稳定的(即重复尝试读取相同的未初始化变量可能很容易导致不同的“垃圾值”)。这样做是为了让优化编译器实现“价值生命周期”的重要概念,从而执行比“对象生命周期”的语言概念所规定的更有效的变量操作。
答案 2 :(得分:5)
答案 3 :(得分:3)
C被设计为一种相对低级的语言,因此它可以用于编写,以及操作系统等低级别的东西。 (事实上,它的设计使得UNIX可以用C语言编写)您可以简单地将其视为具有可读语法和更高级别构造的汇编代码。出于这个原因,C(减去优化)完全按照你的要求去做,仅此而已。
编写int x;
时,编译器只为整数分配内存。你从来没有要求它在那里存储任何东西,所以当你的程序启动时,该位置的任何东西都保持不变。大多数情况下,事实证明,预先存在的价值是“垃圾”。
有时,外部程序(例如设备驱动程序)可能会写入一些变量,因此无需添加另一条指令来初始化这些变量。
答案 4 :(得分:3)
为什么C标准不确定使用不确定变量?
它没有:
对于局部变量,它表示未定义的行为,这意味着任何事情(例如,段错误,擦除硬盘)都是合法的:(Why) is using an uninitialized variable undefined behavior?
对于全局变量,它将它们归零:What happens to a declared, uninitialized variable in C? Does it have a value?