1

我指的是当今主要的静态语言(C、C++、java、C#)。我听到了一些自相矛盾的答案,所以我想知道:

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

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

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

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

哪里只为 x 分配一次内存?

4

1 回答 1

2

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

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

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

  • 除非你在做一个微基准测试(或者一个非常庞大的数字运算任务——但是有多少人对性能感到害怕呢?),即使没有优化,你甚至不会注意到任何差异。如果您在循环体中做任何感兴趣的事情,它将使差异相形见绌(再次,如果有的话)。特别是如果您正在执行任何 I/O。
  • 即使有内存分配,归结为在本机堆栈上压入和弹出几个字节,这又归结为向硬件寄存器添加一个整数常量。所有 C 和 C++ 程序都使用该堆栈作为它们的局部变量,并且没有一个曾经抱怨过它的性能......如果您必须保留空间,那么您无法比使用堆栈更快。
  • 如果你不得不问这种问题,你就不是一个能做任何事情的人。那些人只知道(1)测量它,(2)查看生成的代码,(3)在考虑这个级别之前寻找大规模的优化;)
于 2011-08-25T10:14:12.077 回答