Empty destructors may cause unnecessary data copies

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

Описание

Этот дефект происходит, когда определение класса содержит пользовательский деструктор, который имеет пустое или =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++
Значение по умолчанию: Off
Синтаксис командной строки: EMPTY_DESTRUCTOR_DEFINED
Удар: низко
Введенный в R2020a