在循环方面声明哪个级别变量是否有所不同?

时间:2013-10-05 08:34:40

标签: c performance loops

在C中,除了范围之外,声明循环外的所有变量与之内的所有变量之间有什么区别吗?比另一个快一点吗?例如:

int i;
for(i = 0; i < len; i++)
{
  int j;
  for(j = i; j < len; j++)
  {
    …

VS

int i, j;
for(i = 0; i < len; i++)
{
  for(j = i; j < len; j++)
  {
    …

在概念层面上我有一个问题,因为在第一个例子中,每次迭代都重新声明相同的变量,效率不高吗?

4 个答案:

答案 0 :(得分:2)

仅在该循环内限制变量范围是一种好习惯。 从分配的角度来看,在外循环和内循环中声明变量没有区别。

当您看到反汇编代码时,您应该为两种情况获得相同的代码。您将确切地找到分配变量存储的位置。它在循环外部分配。

答案 1 :(得分:1)

在现代C(AKA C99或C11)中有更好的选择

for(int i = 0; i < len; i++)
{
  for(int j = i; j < len; j++)
  {

是直接在for - 语句中声明循环变量。

在你的简单情况下,任何级别都没有区别,这将全部编译为相同的二进制文件。

在更复杂的情况下,可能会有一个,因为您将为同一个目的“重新使用”相同的变量。您可以轻松地将事物混合在一起,并将之前使用的旧值排放到以后的值,而不是您期望的值。

轻微违规:int在大多数情况下不是正确的类型,用于表示“长度”或类似的循环索引。指数不应为负数,类型的宽度应该是这样的,您可以捕获任何对象的大小。为此目的,现代C有size_t

要使用gcc使用该功能,您必须添加开关-std=c99或使用可执行文件名c99。 clang和POSIX机器上的许多其他编译器默认符合C99。

答案 2 :(得分:0)

在循环(块)内声明的变量只能被该块访问,即它对于该特定块是本地的(从它的声明点到块的末尾是可见的,除此之外你无法访问它范围)。
在代码中

int i;
for(i = 0; i < len; i++)
{
   int j;
   for(j = i; j < len; j++)
   {
       …

j是一个局部变量,具有块范围。在for(i = 0; i < len; i++)结束后,您无法在程序中进一步访问j。对j的所有修改都将保留在此范围内 如果你没有将变量的范围放入帐户,那么在循环的情况下,在任何级别声明变量都没有区别(但这两个代码在这里是不同的)。

答案 3 :(得分:0)

限制范围时,可以使编译器更容易优化代码(例如,确定应在寄存器中使用哪些变量)。一个好的编译器不应该浪费时间在优化条件下在循环开始时“重新声明”变量。