Быстрее ли повторно использовать переменную, определенную в общей области или переопределить ее в каждой внутренней области? - PullRequest
1 голос
/ 07 октября 2010

C ++ конкретно, если это имеет значение, но я думаю, что ответ лежит как-то в ассемблерном коде.

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

Пример: </p> <pre><code>int i; {//block 1 i = SomeFunction(); ... } {//block 2 i = SomeOtherFunction(); ... }

против </p> <pre><code>{//block 1 int i = SomeFunction(); ... } {//block 2 int i = SomeOtherFunction(); ... }

Ответы [ 3 ]

4 голосов
/ 07 октября 2010

Если i является типом POD (как int, показанный в вашем примере), почти наверняка не будет никакой разницы.

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

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

2 голосов
/ 07 октября 2010

Я думаю, что большинство компиляторов выдают одинаковый код для обоих случаев и для int, но я лично предпочитаю второй вариант, поскольку i находится в наименьшей возможной области действия.

1 голос
/ 07 октября 2010

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

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

...