Empty destructors may cause unnecessary data copies

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

Описание

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

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

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

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

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

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

Риск

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

Фиксация

Попробуйте одно из этих решений:

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

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

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

Проверяйте информацию

Группа: Производительность
Язык: C++
Значение по умолчанию: 'off'
Синтаксис командной строки: EMPTY_DESTRUCTOR_DEFINED
Удар: высоко

Введенный в R2020a