Объявление определяемых пользователем типов классов внутри цикла for C++

Вот вопросы, связанные с объявлением переменных встроенного типа внутри цикла for:

Но я хотел бы сузить эту тему и спросить об объявлении пользовательских переменных типа класса, которые наследуются или создаются с помощью композиции и имеют нетривиальные конструкторы/деструкторы с динамическим выделением/освобождением памяти (new/delete).

a)  int count = 0;
    while(count < 1000000)
    {
        myClass myObj = some value;
        ++count;
    }

b)  int count = 0;
    myClass myObj;
    while(count < 1000000)
    {
        myObj = some value;
        ++count;
    }

c)  {
        int count = 0;
        myClass myObj;
        while(count < 1000000)
        {
            myObj = some value;
            ++count;
        }
    }
  1. Если мне нужно использовать определяемую пользователем переменную класса внутри цикла, что является наилучшей практикой для этого, объявить ее внутри или вне цикла?

Если он будет объявлен внутри цикла, цепочка конструкторов и деструкторов будет вызываться на каждой итерации, но у нас будут преимущества ограниченной области действия (a).

Если переменная, которую мы объявили вне цикла, на каждой итерации будет вызываться только оператор присваивания, но эта переменная будет доступна вне области действия цикла (b).

  1. Достаточно ли умны компиляторы, чтобы оптимизировать объявление сложных типов данных как локальную переменную цикла? Выделение памяти происходит один раз, а затем повторно используется одно и то же пространство на каждой итерации?

  2. Если передовой опыт состоит в том, чтобы объявить переменную вне цикла, стоит ли помещать цикл внутрь области действия, чтобы ограничить область действия (C)?


person T M    schedule 14.07.2015    source источник
comment
Если класс имеет определяемый пользователем оператор присваивания или конструктор, то a и b на самом деле делают разные вещи. Какой ты хочешь?   -  person M.M    schedule 14.07.2015
comment
Объявление переменной почти не влияет на производительность, поскольку компилятор выделяет необходимое пространство во время компиляции. Но инициализация переменной стоит. Так что вопрос скорее в том, чего ты хочешь. Должна ли переменная инициализироваться в каждом цикле или она должна быть инициализирована один раз перед циклом. Это не вопрос стиля, а то, чего вы хотите достичь.   -  person nv3    schedule 14.07.2015
comment
@Matt McNabb Мне нужно использовать локальную переменную внутри цикла, поэтому я хочу знать, что лучше всего в этом случае объявить вне цикла или внутри?   -  person T M    schedule 14.07.2015
comment
В потоках, которые я упомянул, лучшая практика для встроенных типов — это объявление и использование внутри цикла, поэтому я хочу понять, что лучше всего подходит для пользовательских типов.   -  person T M    schedule 14.07.2015


Ответы (1)


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

{
    Object object;
    for (int i = 0; i < 100000; ++i) {
        // ....
    }
} // 'object' will be destroyed
person Validus Oculus    schedule 14.07.2015