exponenta event banner

Пустые деструкторы могут вызвать ненужные копии данных

Объявленные пользователем пустые деструкторы предотвращают автогенерацию конструкторов перемещений и операторов назначения перемещений

Описание

Этот дефект возникает, когда определение класса содержит определяемый пользователем деструктор, имеющий пустой или =default и не объявляет как конструктор перемещения, так и оператор назначения перемещения. Например:

class aClass
{
public:
    ~aClass() noexcept
     {} // Empty body
};
class bClass
{
public:
    ~bClass() = default;
};
Деструкторы выше точно такие же, как и версия, предоставленная компилятором, но они препятствуют автоматическому созданию операторов перемещения. В результате тип класса не является подвижным.

Пустой деструктор не отмечается, если:

  • Деструктор является частным или защищенным.

  • Деструктор объявлен окончательным.

  • Деструктор объявлен как виртуальный и не переопределяет деструктор базового класса.

  • Деструктор переопределяет чистый виртуальный деструктор базового класса.

  • Класс имеет тривиальный конструктор копирования (и поэтому операция копирования не дороже операции перемещения).

Риск

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

Зафиксировать

Попробуйте одно из следующих решений:

  • По возможности удалите пустой деструктор. Если класс не имеет деструктора, компилятор создает деструктор, который по существу является пустым деструктором, объявленным явным образом.

    См. также Правило нуля.

  • Если удалить деструктор невозможно, добавьте явный конструктор перемещения и оператор назначения перемещения в определение класса. Используйте =default для уточнения того, что используются определения компилятора конструкторов перемещения и операторов назначения перемещения.

    class aClass
    {
    public:
         ~aClass() noexcept = default;
         aClass(aClass&& ) = default;
         aClass& operator=(aClass&& ) = default;
    };

    См. также Правило пяти.

Повышение производительности может зависеть от используемого компилятора, реализации библиотеки и среды.

Информация о результатах

Группа: Производительность
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: EMPTY_DESTRUCTOR_DEFINED
Воздействие: Низкий
Представлен в R2020a