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

sub*_*nki 9 c

垃圾值存储在哪里,出于何种目的?

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.这曾经很重要,在嵌入式系统上仍然如此.

  • 你的第一个片段不是一个非常好的随机数生成器. (4认同)
  • @Michael Burr:我将其理解为"除非您正在使用嵌入式系统,否则您不必担心额外指令对性能的影响." (3认同)
  • 如果您的自动变量是一个大型数组并且您的函数在该调用中没有做很多事情,那么它仍然很重要. (3认同)
  • @Cogwheel:这就是它想要传达的内容。你知道规则:让它发挥作用、让它正确、让它快速……按照这个顺序。 (2认同)
  • @Rannick:或者你可以每秒呼叫这个功能数千次.它发生在我工作的一个项目中.一些日志记录功能正在初始化缓冲区,然后决定对优先级低于ERROR并返回的任何内容禁用日志记录. (2认同)

AnT*_*AnT 7

垃圾值实际上并未存储在任何地方.实际上,就抽象语言而言,垃圾值并不存在.

您可以看到,为了生成最有效的代码,编译器根据对象(变量)的生命周期进行操作是不够的.为了生成最有效的代码,编译器必须在更精细的级别上运行:它必须根据生命周期 "思考" .例如,这对于执行CPU寄存器的有效调度是绝对必要的.

抽象语言没有"价值终身"这样的概念.但是,语言作者认识到该概念对优化编译器的重要性.为了给编译器足够的自由来执行有效的优化,有意地指定语言,以便它不会干扰重要的优化.这就是"垃圾价值"出现的地方.该语言并未声明垃圾值存储在任何地方,该语言不保证垃圾值是稳定的(即重复尝试读取相同的未初始化变量可能很容易导致不同的"垃圾值").这是专门为了让优化编译器实现"价值生命周期"的重要概念而完成的.


Dav*_*veE 5

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