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