Loops 循环中的变量声明是否错误? 我指的是今天的主要静态语言(C,C++,爪哇,C,)。我听到了一些相互矛盾的答案,所以我想知道:

Loops 循环中的变量声明是否错误? 我指的是今天的主要静态语言(C,C++,爪哇,C,)。我听到了一些相互矛盾的答案,所以我想知道:,loops,variable-declaration,Loops,Variable Declaration,如果我有一些代码,例如: loop(...) { type x = val; ... } (“循环”是某种类型的循环,例如for、while) 它会在循环的每次迭代中导致内存分配,还是只会导致一次?这与写这篇文章有什么不同: type x; loop(...) { x = val; ... } 如果只为x分配一次内存?严格正确的答案是它取决于实现,因为两者在语义上都是正确的。没有任何语言规范会要求或禁止此类实现细节 也就是说,任何值得一试的实现都能够重用相同的堆栈插槽甚至CP

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

loop(...) {
  type x = val;
  ...
}
(“循环”是某种类型的循环,例如for、while)
它会在循环的每次迭代中导致内存分配,还是只会导致一次?这与写这篇文章有什么不同:

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

如果只为x分配一次内存?

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

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

最后,还有早熟优化的问题。。。除非另有证明,否则您甚至不应该考虑像这样的低级细节(如果您认为知识和对这些问题的控制很重要,也许您应该在assembler中编程),因为:

  • 除非你在做一个微基准(或者是一个非常庞大的数字运算任务——但有多少人对性能感到抓狂,真的这么做了?),否则即使没有优化,你也不会注意到任何差异。如果您在循环体中做任何感兴趣的事情,它将缩小差异(如果有的话)。特别是如果你正在做任何I/O
  • 即使存在内存分配,也归结为在本机堆栈上推送和弹出几个字节,这反过来归结为向硬件寄存器添加一个整数常量。所有的C和C++程序都使用该栈作为它们的局部变量,而非那些程序曾经抱怨过它的性能…如果必须保留空间,那么使用堆栈的速度是最快的
  • 如果你不得不问这样的问题,你不是一个对此无能为力的人。那些人只知道(1)测量它,(2)查看生成的代码,(3)在考虑这个级别之前寻找大规模优化;)
可能是@Nick:Thank的复制品,看起来是的。我错过了。