Объявление переменных внутри цикла - это плохо? - PullRequest
0 голосов
/ 25 августа 2011

Я имею в виду основные статические языки сегодня (C, C ++, Java, C #,). Я слышал некоторые противоречивые ответы по этому поводу, поэтому я хотел знать:

Если у меня есть код, например:

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

(«цикл» - это цикл определенного типа, например, для, в то время как)
Будет ли это вызывать выделение памяти на каждой итерации цикла или только один раз? Это отличается от написания этого:

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

где память выделяется только один раз для x?

1 Ответ

1 голос
/ 25 августа 2011

Строго правильный ответ заключается в том, что это зависит от реализации, так как оба семантически верны. Никакая языковая спецификация не требует и не запрещает такие подробности реализации.

Тем не менее, любая реализация, достойная солидности, сможет повторно использовать один и тот же слот стека или даже регистр ЦП (с нативной компиляцией, особенно вероятно при наличии JIT). Даже байт-код, вероятно, будет полностью идентичен.

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

  • Если вы не выполняете микробенчмарк (или действительно огромную задачу по сокращению чисел, но сколько людей волнуется по поводу производительности на самом деле?), Вы даже не заметите никакой разницы, даже если она не оптимизирована. Если вы делаете что-то интересное в теле цикла, оно уменьшит разницу (опять же, если есть). Особенно , если вы делаете какой-либо ввод / вывод.
  • Даже если есть выделение памяти, оно сводится к выталкиванию и выталкиванию нескольких байтов в собственный стек, что, в свою очередь, сводится к добавлению целочисленной константы в аппаратный регистр. Все программы на C и C ++ используют этот стек для своих локальных переменных, и ни одна из тех, кто никогда не жаловался на его производительность ... если вам нужно зарезервировать пространство, вы не можете получить скорость быстрее, чем при использовании стека.
  • Если вам нужно задать такой вопрос, вы не тот, кто может с этим что-то сделать. Те, кто знает, просто (1) измерить его, (2) посмотреть на сгенерированный код и (3) искать масштабные оптимизации, прежде чем даже думать об этом уровне;)
...