13-08-2023
Простая структура данных (англ. plain old data, POD) — в современных языках программирования высокого уровня тип данных, имеющий жёстко определённое расположение полей в памяти, не требующий ограничения доступа и автоматического управления. Переменные такого типа можно копировать простыми процедурами копирования участков памяти наподобие memcpy
. Противоположность — управляемая структура данных.
Проще всего простую структуру данных определить от противного. Если компилятор скрытно от пользователя переставил поля местами, или при появлении переменной нужно вызвать конструктор, или при исчезновении нужно вызвать деструктор, или при копировании — особую процедуру копирования, это управляемая (то есть не простая) структура.
В стандартном Паскале и Си все типы данных являются простыми.
Простые структуры данных имеют две особенности.
Компилятор может автоматически перестроить структуру данных по своему усмотрению (например, изменить порядок полей). Подобная перестройка может серьёзно сэкономить память, но нарушает совместимость. В POD’ах такая оптимизация отключена.
Другими словами: типы, отмеченные как POD, устроены в памяти в точности так, как описал программист (возможно, с некоторым выравниванием). Поэтому только POD’ы можно использовать для связи между двумя библиотеками времени выполнения. В частности — для передачи данных из программы в программу, из плагина в плагин, для связи с кодом, написанным на другом языке программирования. Чтобы быстро записать на диск сложный заголовок файла наподобие BMP, можно сформировать его в памяти, а затем записать одной командой — но структура данных, в которой формируем заголовок, также должна быть POD’ом.
Это значит, что при появлении объекта не нужно вызывать конструктор, при копировании — операцию присваивания, а при уничтожении — деструктор. Это, в свою очередь, даёт такие преимущества.
memcpy
.union
(в Паскале соответственно record/case
).GetLastError
[1] плохо совместимы с автоматически управляемыми типами.В C++ POD определяется от противного. Тип данных является POD’ом, если:
operator=
, принимающего на входе тот же тип);private
и protected
;По стандарту C++ простой тип данных устроен в точности так, как описано. Управляемую же структуру компилятор может реорганизовать так, как он сочтёт наиболее эффективным.
«Предсказуемое устройство в памяти» и «отсутствие управляющего кода» — сходные, но разные свойства типа. Например, структуру данных STRRET
,[2] которая в Windows служит для передачи строк из одного менеджера памяти в другой, можно «обернуть» в управляющий код, но второе свойство — предсказуемое устройство — остаётся. Поэтому концепция POD’ов в C++11 разделена на три.
Класс является тривиальным, если у него тривиальны:
T()
;T(T&)
;T(T&&)
;
~T()
;operator=(T&)
;operator=(T&&)
.Такие типы могут копироваться через memcpy
.
Класс является типом со стандартным устройством, если:
private
, все protected
или все public
) и определены в одном классе.У таких типов предсказуемое устройство в памяти, их можно передавать в другую библиотеку времени выполнения.
Тогда POD — это тривиальный тип по стандартным устройством, все нестатические поля которого — POD’ы.
Для работы с константами, вычисляемыми при компиляции, и статической инициализации в C++11 есть более мягкое понятие — литеральный тип. А именно:
T()
, либо какой-нибудь конструктор (кроме конструктора копирования и перемещения) отмечен как constexpr
;T(T&)
тривиальный;
T(T&&)
тривиальный или запрещён;~T()
;Простыми структурами данных считаются все типы, кроме:
AnsiString
, WideString
, UnicodeString
);class
. Впрочем, TObject
, TButton
и т. д. — это указатели на объект и всегда являются простыми типами!Это заготовка статьи о компьютерных языках. Вы можете помочь проекту, дополнив её. |
Plain Old Data Structures.