POD (Plain Old Data) - несколько устаревшая концепция, означавшая пересечение TrivialType и StandardLayoutType. TrivialType - ограничение на поведение special member functions (конструкторы, деструкторы, присваивание), которое сводится к тому, что есть хотя бы один способ скопировать/переместить/разрушить объект класса обычным копированием его объектной репрезентации (данных в памяти) либо невыполнением каких-либо действий вообще (no-op), т.е. под эти операции не предусмотрено специального поведения. StandardLayoutType - ограничение на состав объекта, которое обеспечивает предсказуемость его объектной репрезентации (порядок размещения данных в памяти) и обычно используется для стабилизации ABI.
Я это понимаю, что есть тривиальный - это тот, где не определен ни один из конструктровро и тд (на спп реф видел список), а другие - это стандарт элоун. Так было раньше, по крайней мере. А как это влияет именно на код?
Оно по сути должно воспринимать такие типы как тупой массив в памяти. Иначе у тебя какое-то специфичное поведение которое надо по другому обрабатывать.
Яркий пример выше: преобразование указателя на экземпляр к указателю на его первое поле требует StandardLayout. Тривиальность же требуется, например, для свойства implicit-lifetime, которое позволяет создавать объекты неявно при переключении полей union'а или "низкоуровневых" операций создания байтоподобного массива или выделения памяти. Имплементации могут делать оптимизации на основании знания о том, что объект тривиален (это значит, опять же, что он исчерпывающе определяется объектной репрезентацией).
POD можно копировать через memcpy. Не POD требует вызова какого-то особого кода (конструкторы, операторы)
Обсуждают сегодня