Стандарт С++ определяет некоторые очень специфические поведения, когда класс имеет тривиальный конструктор и/или тривиальный деструктор.
В качестве примера, согласно § 3.8/1 стандарта:
Время жизни объекта типа
T
заканчивается, когда:- если
T
- это тип класса с нетривиальным деструктором (12.4), начинается вызов деструктора или- хранилище, которое занимает объект, повторно используется или освобождается.
Итак,
- Если объект не является тривиально разрушаемым, любая попытка доступа к элементам объекта после вызова деструктора - это UB.
- Если объект тривиально разрушаем, попытка доступа к элементам объекта после вызова деструктора является безопасным, а не UB.
Хотя этот пример может быть не лучшим, он показывает, что разница в поведении, возможно, имеет решающее значение (UB/non-UB), является ли объект тривиально разрушаемым или нет.
§12.4/3 Стандарта утверждает, что (для суммирования) деструктор класса T
тривиален, если он неявно определен, а не виртуальный, и если все базовые классы и члены класс T
тривиально разрушаемы.
В моем (скромном) опыте я никогда не видел разницы с точки зрения кода, сгенерированного компилятором, между:
- класс с тривиальным значением по умолчанию ctor и/или тривиальным dtor и
- класс с определяемым пользователем пустым ctor и/или не виртуальным пользователем пустым dtor (если класс, его базовые классы и классы участников также имеют не виртуальный dtor пользователь, определенный пустым или тривиальным)
Итак, мои вопросы:
- Каким образом пользователь может определить пустой ctor/dtor, может или не может считаться тривиальным ctor/dtor относительно генерации кода компилятора, оптимизации, компромиссов,...
- Тот же вопрос с пользовательским непустым ctor/dtor; какие правила должны следовать коду, реализованному в ctor/dtor, чтобы рассматривать их как тривиальные.
Мой вопрос не связан со стандартом (пожалуйста, не отвечайте стандартным состояниям, что является тривиальным ctor/dtor, поэтому пользовательский ctor/dtor не является), а в том, как компиляторы имеют дело с определенными пользователем ctor/dtor и в каким образом поведение скомпилированного кода может измениться (или нет) по сравнению с тривиальным ctor/dtor.