Быстрее ли использовать переменную, определенную в общей области или переопределить ее в каждой внутренней области?
C++ конкретно, если это имеет значение, но я думаю, что ответ лежит как-то в ассемблерном коде.
Если у нас есть несколько блоков в общей области (скажем, функция), каждый из которых использует переменную одного и того же типа, быстрее ли определить переменную в общей области и повторно инициализировать ее в каждом блоке, или переопределить и инициализировать ее в каждом из блоков (или нет принципиальной разницы)?
Пример:
int i; {//block 1 i = SomeFunction(); ... } {//block 2 i = SomeOtherFunction(); ... }
против
{//block 1 int i = SomeFunction(); ... } {//block 2 int i = SomeOtherFunction(); ... }
3 ответа
Если i
это тип POD (например, int
показано в вашем примере), почти наверняка не будет никакой разницы вообще.
Если i
имеет некоторый тип, который имеет нетривиальный конструктор или оператор присваивания, который делает что-то захватывающее, тогда может быть огромная разница, и вам придется сравнить, что делают соответствующие конструкторы и операторы присваивания. Если оба блока введены, вам нужно будет рассмотреть и деструктор.
В общем, не стоит об этом беспокоиться. Используйте более чистый подход и объявите переменную в максимально возможной области видимости, максимально приближенной к ее первому использованию, и реорганизуйте ее, только если ваш профилировщик скажет вам, что это проблема производительности.
Я предполагаю, что большинство компиляторов производят один и тот же код для обоих случаев и int
но лично я предпочитаю второй вариант, т.к. i
находится в наименьшем возможном объеме.
Это в основном то же самое, если это не структура / класс (хотя распределение регистров более очевидно не ограничено для использования внутри блока, которое может помочь оптимизатору, но любой оптимизатор, которому нужен такой уровень помощи, должен быть помещен в дом престарелых),
Для классов это зависит от относительной производительности конструктора / деструктора и оператора =(). Поэтому нет единого правильного ответа. Тем не менее, создание переменных внутри более локализованной области видимости в целом является лучшей практикой программирования, и эта проблема обычно доминирует.