为什么C标准不确定使用不确定变量?

时间:2010-07-14 16:03:12

标签: c

存储垃圾值的位置和目的是什么?

5 个答案:

答案 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)

几年前,IIRC,Thompson或Richie接受了一次采访,他们说语言定义故意在某些地方使事情变得模糊,因此特定平台上的实施者有余地做有意义的事情(周期,记忆等)在该平台上。对不起,我没有参考链接。

答案 3 :(得分:3)

C被设计为一种相对低级的语言,因此它可以用于编写,以及操作系统等低级别的东西。 (事实上​​,它的设计使得UNIX可以用C语言编写)您可以简单地将其视为具有可读语法和更高级别构造的汇编代码。出于这个原因,C(减去优化)完全按照你的要求去做,仅此而已。

编写int x;时,编译器只为整数分配内存。你从来没有要求它在那里存储任何东西,所以当你的程序启动时,该位置的任何东西都保持不变。大多数情况下,事实证明,预先存在的价值是“垃圾”。

有时,外部程序(例如设备驱动程序)可能会写入一些变量,因此无需添加另一条指令来初始化这些变量。

答案 4 :(得分:3)

  

为什么C标准不确定使用不确定变量?

它没有: