Быстрее ли использовать переменную, определенную в общей области или переопределить ее в каждой внутренней области?

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 находится в наименьшем возможном объеме.

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

Для классов это зависит от относительной производительности конструктора / деструктора и оператора =(). Поэтому нет единого правильного ответа. Тем не менее, создание переменных внутри более локализованной области видимости в целом является лучшей практикой программирования, и эта проблема обычно доминирует.

Другие вопросы по тегам