重用变量是好还是坏?

Joh*_*der 13 c variables

如果我尽可能多地重用变量名,我想知道它是好还是坏(或无关紧要)?例如

int main(void){
  //...
  int x=0;

  //..
  x = atoi(char_var);

  //..

  for (x=0; x<12; x++){
   //...
  }

  //..
  x = socket(...)
  if(x<0){
  //...
  }

  for(x=0;x<100;x++{
  //...
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

可以使用另一个变量而不是x上面的(可能更好的可读性),但我想知道它是否会为二进制大小,性能或其他任何东西带来任何好处?

xxb*_*bcc 19

一般来说,为不同的目的重复使用变量名称是非常糟糕的做法 - 如果其他人需要在以后需要维护您的代码,则必须在代码中找到这些"上下文切换",x现在突然意味着除了之前的含义之外的其他内容代码行.

你可能会节省一些内存,但与它引入的问题相比,这是一个很小的建议.(也请阅读下面的编辑.)

通常,建议不要为循环计数器以外的地方使用1个字符的变量名.有人可能会说这x也可能是一个X坐标但在这种情况下我会使用一些前缀或更长的名称.单字母变量名称太短,无法提供有关变量用途的有意义的提示.

编辑:正如几条评论(以及其他一些答案)所指出的,潜在的内存节省(如果有的话)取决于编译器的优秀程度.编写良好的优化编译器可能会意识到两个变量没有重叠的生命周期,因此它们无论如何只分配一个变量槽.最终结果是没有运行时增益,而且可维护源代码仍然较少.这只是强化了论点:不要重用变量.

  • 我不认为我索引是那么糟糕. (5认同)

m0s*_*it0 7

与编程中的几乎所有内容一样,这取决于具体情况.

如果您为不同的目的重复使用相同的变量,那么它会降低您的代码的可读性,而您不应该这样做.如果目的是相同的(例如循环计数器),那么您可以重复使用没有问题,因为这不会使您的代码不易读取.

重用一个变量将避免在堆栈中保留空间,这会导致更快(您不会浪费时间在堆栈中保留空间并推送值)并减少内存消耗(您不将其存储在堆栈中)程序.但是这种好处在整个程序环境中是绝对可以忽略不计的,也与架构,语言和编译器有关.所以我会更担心可读性而不是这个微小的好处.


jap*_*iss 6

坏的。对于像ints这样的简单类型,按值传递,编译器将能够确定何时不需要它们并重用空间。

例如,我在 Visual Studio 2010 中使用 32 位发布模式编译了以下 C++ 代码:

for (int i = 0; i < 4; ++i)
{
    printf("%d\n", i);
}

for (int j = 0; j < 4; ++j)
{
    printf("%d\n", j);
}
Run Code Online (Sandbox Code Playgroud)

并得到以下汇编器输出:

; 5    :    for (int i = 0; i < 4; ++i)

    mov edi, DWORD PTR __imp__printf
    xor esi, esi
    npad    6
$LL6@main:

; 6    :    {
; 7    :        printf("%d\n", i);

    push    esi
    push    OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
    call    edi
    inc esi
    add esp, 8
    cmp esi, 4
    jl  SHORT $LL6@main

; 8    :    }
; 9    : 
; 10   :    for (int j = 0; j < 4; ++j)

    xor esi, esi
$LL3@main:

; 11   :    {
; 12   :        printf("%d\n", j);

    push    esi
    push    OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
    call    edi
    inc esi
    add esp, 8
    cmp esi, 4
    jl  SHORT $LL3@main

; 13   :    }
Run Code Online (Sandbox Code Playgroud)

您可以看到编译器正在esi为i和使用寄存器j。