循环中的变量声明是不是很糟糕?

时间:2011-08-25 10:10:30

标签: loops variable-declaration

我指的是今天的主要静态语言(C,C ++,java,C#,)。我听说过这个有些矛盾的答案,所以我想知道:

如果我有一些代码,例如:

loop(...) {
  type x = val;
  ...
}

('loop'是某种类型的循环,例如for,while) 它会在循环的每次迭代中导致内存分配,还是只导致一次?它与写这个不同:

type x;
loop(...) {
  x = val;
  ...
}

其中内存仅为x?

分配一次

1 个答案:

答案 0 :(得分:1)

严格正确的答案是它取决于实现,因为两者在语义上都是正确的。没有语言规范要求或禁止此类实施细节。

也就是说,任何有价值的实现都能够重用相同的堆栈槽甚至CPU寄存器(使用本机编译,尤其是在存在JIT的情况下)。甚至字节码也可能完全相同。

最后,那就是过早优化的事情......除非另有证明,否则你甚至不应该考虑这样的低级细节(如果你认为对这些问题的知识和控制很重要,也许你应该只是编程在汇编程序中),因为:

  • 除非你正在做一个微基准测试(或者是一个非常庞大的数字处理任务 - 但是有多少人会对性能感到害怕?),即使它没有经过优化,你也不会注意到任何差异。如果你在循环体中做任何感兴趣的事情,它会使差异相形见绌(如果有的话)。 特别是,如果您正在进行任何I / O.
  • 即使存在内存分配,也可以归结为在本机堆栈上推送和弹出几个字节,这反过来归结为向硬件寄存器添加整数常量。所有C和C ++程序都使用该堆栈作为其局部变量,而不是那些曾经抱怨过它的性能......如果你必须保留空间,你就不会比使用堆栈更快。
  • 如果你不得不提出这样的问题,你就不是那些可以做任何事情的人。那些人只知道(1)测量它,(2)查看生成的代码,(3)在考虑这个级别之前寻找大规模的优化;)