Мой инструктор однажды сказал мне, что я не должен определять переменную внутри цикла , но я, честно говоря, до сих пор не понимаю, почему.
Каковы недостатки этого?
Может ли кто-нибудь объяснить это мне?
Мой инструктор однажды сказал мне, что я не должен определять переменную внутри цикла , но я, честно говоря, до сих пор не понимаю, почему.
Каковы недостатки этого?
Может ли кто-нибудь объяснить это мне?
const
если нет причин для этого (привычка функционального программирования). Либо я не буду изменять их, и оптимизатор должен определять, когда они не нужны, либо я сделаю это, и я предотвратил серьезную ошибку. Когда эти постоянные промежуточные значения являются специфическими для итерации цикла, это означает их объявление внутри цикла. Однако в другой раз вам нужно объявить переменные вне цикла, когда вы будете ссылаться на них вне цикла; например, результаты, которые вы храните.Ответы:
Это не проблема, чтобы определить переменную в цикле. На самом деле это хорошая практика, так как идентификаторы должны быть ограничены наименьшей возможной областью действия.
Плохо назначать переменную в цикле, если вы могли бы назначить ее один раз до запуска цикла. В зависимости от того, насколько сложна правая часть назначения, это может стать довольно дорогостоящим и даже повлиять на время выполнения цикла. Если вы пишете цикл, который использует одно и то же вычисленное значение во всех итерациях, вы должны определенно вычислить его выше цикла - это важнее, чем минимизация его объема.
Уточнить: пока
compute()
всегда возвращает одно и то же значение, этоумнее, чем это:
источник
1/1/1900
, переменная должна быть объявлена, а значение должно быть назначено до цикла.Сложные типы имеют нетривиальные конструкторы и деструкторы.
Они будут вызваны в начале и в конце тела цикла (так как он инициализируется и выходит из области видимости). Если инициализация дорогая, так как ей нужно выделить немного памяти, этого следует избегать.
Однако для тривиальных типов это не проблема. Само выделение и освобождение - это просто сложение и вычитание значения из указателя стека. (который будет оптимизирован)
источник
Ну, его совет немного слишком прост (это преуменьшение).
Следование за ним простирается от хорошей идеи о том, кому небезразлично, а плохой до невозможной .
Вы должны следовать им всякий раз, когда повторное использование дешевле, чем уничтожение старого и создание нового.
Вы должны избегать этого как вопрос стиля, когда это не имеет значения для производительности.
Вы действительно должны избегать его, когда он имеет худшую производительность или неправильную семантику.
Вы не можете следовать этому, когда используемый тип не допускает ни подкачки, ни перемещения, ни копирования.
источник
for (std::string s; std::cin >> s;) ...
и оставаться «снаружи»