2010-10-07 1 views
1

C++ конкретно, если это имеет значение, но я думаю, что ответ лежит в ассемблере как-то.Быстрее использовать переменную, определенную в общей области, или переопределять ее в каждой внутренней области?

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

Пример:

int i; 

{//block 1 
    i = SomeFunction(); 
    ... 
} 

{//block 2 
    i = SomeOtherFunction(); 
    ... 
} 

против

{//block 1 
    int i = SomeFunction(); 
    ... 
} 

{//block 2 
    int i = SomeOtherFunction(); 
    ... 
} 

ответ

2

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

4

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

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

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

+0

нетривиальный конструктор * или деструктор * ...? –

+0

Это зависит от того, какой блок введен, да. Если оба блока введены, вы получите дополнительное уничтожение объекта, если вы объявите переменную как можно более локальной. Если блоки не введены, очевидно, что вы не получите никаких разрушений (и никаких творений!) –

1

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

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

+0

В этом случае я ошибаюсь на стороне хорошей практики программирования, вместо того, чтобы пытаться минимизировать оптимизацию, если только оптимизация не возникает в конкретных случаев не быть таким крошечным. – Innominate