Полезно или плохо использовать переменные?

Интересно, хорошо или плохо (или не имеет значения), если я использую имена переменных как можно больше? например

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;
}

Вместо x могут использоваться другие переменные (может быть, лучше для удобочитаемости), но мне интересно, предоставит ли она мне какую-либо выгоду для двоичного размера, производительности или чего-нибудь еще?

Ответ 1

В общем, очень плохой практикой повторного использования имен переменных для разных целей - если кому-то еще нужно сохранить свой код позже, человеку придется найти эти "контекстные переключатели" в вашем коде, где x теперь внезапно означает что-то другое чем это означало перед этой строкой кода.

Вы можете получить некоторую экономию памяти, но это настолько мало по сравнению с проблемами, которые она представляет, что она советует против. (Также читайте приведенное ниже.)

Обычно также рекомендуется не использовать односимвольные имена переменных для других, кроме счетчиков циклов. Можно утверждать, что x также может быть координатой X, но в этом случае я бы использовал некоторый префикс или более длинное имя. Однобуквенные имена переменных слишком короткие, чтобы дать осмысленные подсказки о цели переменной.

Изменить: как указано в нескольких комментариях (и некоторых других ответах), потенциальная экономия памяти (если таковая имеется) зависит от того, насколько хорош компилятор. Хорошо написанные оптимизирующие компиляторы могут понять, что две переменные не имеют перекрывающихся сроков жизни, поэтому они все равно выделяют один слот переменной. Конечным результатом будет отсутствие усиления во время выполнения и еще менее ремонтируемый исходный код. Это только усиливает аргумент: не используйте повторно переменные.

Ответ 2

Как и почти все в программировании, это зависит от ситуации.

Если вы повторно используете одну и ту же переменную для разных целей, это делает ваш код менее читаемым, и вы не должны этого делать. Если цель та же самая (например, счетчики циклов), вы можете повторно использовать ее без проблем, поскольку это не делает ваш код менее читаемым.

Повторное использование переменной позволит избежать резервирования места в стеке, что приводит к ускорению (вы не тратите время на резервирование пространства в стеке и нажимаете значение) и меньше потребляете память (вы не храните его в стеке) программа. Но эти преимущества абсолютно ничтожны во всем контексте программы, а также относительно архитектуры, языка и компилятора. Поэтому я бы больше беспокоился о читаемости, чем это крошечные преимущества.

Ответ 3

Bad. Для простых типов, таких как int s, переданных по значению, компилятор сможет определить, когда они не нужны и повторно использовать пробел.

Например, я скомпилировал следующий код С++ в Visual Studio 2010 с использованием 32-разрядного режима выпуска:

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

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

и получил следующий выход ассемблера:

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

    mov edi, DWORD PTR __imp__printf
    xor esi, esi
    npad    6
[email protected]:

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

    push    esi
    push    OFFSET [email protected][email protected][email protected]
    call    edi
    inc esi
    add esp, 8
    cmp esi, 4
    jl  SHORT [email protected]

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

    xor esi, esi
[email protected]:

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

    push    esi
    push    OFFSET [email protected][email protected][email protected]
    call    edi
    inc esi
    add esp, 8
    cmp esi, 4
    jl  SHORT [email protected]

; 13   :    }

Вы можете видеть, что компилятор использует регистр esi для i и j.

Ответ 4

  int x=0;

  //..
  x = atoi(char_var);

  //..
  int x = 0;

Вы не можете обновлять x в той же области. Если вы не обновляете его, а используете его для разных целей, вы можете это сделать. Но это плохая практика, и ее следует избегать, поскольку она уменьшает читаемость кода. Также вы должны найти значимые имена для своих переменных по тем же причинам.

Ответ 5

Вы можете повторно использовать его, но я не думаю, что это принесет вам какое-то значительное преимущество в вашей программе, и это сделает ваш код менее удобочитаемым.

Ответ 6

В целом для любого языка, если вы повторно используете имена переменных, а затем вы решите реорганизовать часть своего кода на другой метод, вам придется добавлять или редактировать объявления.

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

Предположим, вы берете второй цикл и переместите его в метод print_cubes. Вы не сможете просто вырезать и вставить цикл for, так как i не будет там декларации. Хорошая среда IDE может вставлять декларацию, но она может беспокоиться о побочных эффектах на i в введенном вами коде.

В общем случае компиляторы могут консолидировать используемые переменные так называемыми алгоритмами графополяризации. Рассмотрим этот вариант:

for(int i = 0; i < 10; ++i) {  // BLOCK 1
    printf("%d\t%d\n", i , i * i);
} // END BLOCK 1
for(int j = 0; j < 10; ++j) { // BLOCK 2
    printf("%d\t%d\n", j , j * j * j);
} // END BLOCK 2

В компиляторе перечислены используемые переменные: i, j. В нем перечислены используемые блоки: БЛОК 1, БЛОК 2. Родительская функция также является блоком, но i и j видны только в блоках 1 и блоке 2. Таким образом, он создает график переменных и соединяет их только в том случае, если они видны в одном блоке. Затем он пытается вычислить минимальное количество цветов, необходимых для окраски каждой вершины, не давая двум смежным вершинам одинакового цвета, аналогично четырехцветной теореме Хакена-Аппеля. Вот; требуется только один цвет.

Ответ 7

Положите это так: как бы вам это понравилось, если бы я написал большую кучу недокументированного, сложного кода таким образом, и тогда вы получите работу по его поддержанию/усилению.

Пожалуйста, не делайте такого, когда-либо:)

Ответ 8

Лучше повторно использовать переменные в памяти. Но будьте осторожны, вам не нужно значение в переменной, прежде чем повторно использовать его. Кроме этого, вы не должны всегда использовать переменную. Важно сохранить чистый и читаемый код. Поэтому я советую вам выбрать другую переменную с именами в зависимости от контекста, чтобы ваш код не запутывался.

Вы также должны взглянуть на распределение динамической памяти в C, что очень полезно для управления памятью и переменными.

https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

Ответ 9

Единственным недостатком является читаемость вашего кода.

Повторное использование переменных позволяет сохранить память.

Скорость не изменяется (если вам не нужно использовать дополнительные инструкции для повторного использования переменной).