- Простая структура данных
-
Простая структура данных (англ. plain old data, POD) — в современных языках программирования высокого уровня тип данных, имеющий жёстко определённое расположение полей в памяти, не требующий ограничения доступа и автоматического управления. Переменные такого типа можно копировать простыми процедурами копирования участков памяти наподобие
memcpy
. Противоположность — управляемая структура данных.Проще всего простую структуру данных определить от противного. Если компилятор скрытно от пользователя переставил поля местами, или при появлении переменной нужно вызвать конструктор, или при исчезновении нужно вызвать деструктор, или при копировании — особую процедуру копирования, это управляемая (то есть не простая) структура.
В стандартном Паскале и Си все типы данных являются простыми.
Содержание
Преимущества простых структур данных
Простые структуры данных имеют две особенности.
Предсказуемое устройство в памяти
POD’ы устроены в памяти в точности так, как описал программист (возможно, с некоторым выравниванием). Поэтому POD’ы широко применяются для связи между двумя библиотеками времени выполнения. В частности — для передачи данных из программы в программу, из плагина в плагин, для связи с кодом, написанным на другом языке программирования.
Отсутствие управляющего кода
Это значит, что при появлении объекта не нужно вызывать конструктор, при копировании — операцию присваивания, а при уничтожении — деструктор. Это, в свою очередь, даёт такие преимущества.
- Статическая инициализация. Вместо того, чтобы при запуске программы скрытно от программиста вызывать конструктор, POD’ы можно собрать ещё при компиляции программы.
- Опять-таки, это важно для связи между программами: ведь менеджер памяти не должен заниматься управлением в той памяти, которая ему не принадлежит.
- Только простые типы могут находиться в
union
(в Паскале соответственноrecord/case
). - Функции с побочным эффектом наподобие
GetLastError
плохо совместимы с автоматически управляемыми типами.
В C++
В C++ POD определяется от противного. Тип данных является POD’ом, если:
- у него нет конструктора, деструктора и копирующей операции присваивания (то есть
operator=
, принимающего на входе тот же тип); - среди нестатических полей нет ссылок C++, не-POD’ов,
private
иprotected
; - нет виртуальных методов;
- он ни от чего не унаследован.
По стандарту C++ простой тип данных устроен в точности так, как описано. Управляемую же структуру компилятор может реорганизовать так, как он сочтёт наиболее эффективным.
В C++11
Концепция POD’ов в C++11 разделена на две.
Тип данных является тривиальным, если:
- у него нет конструктора, деструктора, виртуальных методов и копирующей операции присваивания (то есть
operator=
, принимающего на входе тот же тип). - все его нестатические поля тривиальны.
Такие типы могут инициализироваться статически, копироваться через
memcpy
.Тип данных является типом со стандартным устройством, если:
- все нестатические поля имеют одинаковые права доступа (все
private
, всеprotected
или всеpublic
) и определены в одном классе. - нет виртуальных методов, виртуального наследования.
- первое определённое поле не совпадает по типу ни с одним из родительских классов.
У таких типов предсказуемое устройство в памяти, их можно передавать в другую библиотеку времени выполнения.
Тогда POD — это тривиальный тип по стандартным устройством, все нестатические поля которого — POD’ы.
В Embarcadero Delphi
Простыми структурами данных считаются все типы, кроме:
- новых строк неограниченной длины (
AnsiString
,WideString
,UnicodeString
); - интерфейсов COM;
- динамических массивов;
- типов, которые содержат один из этих трёх;
- новых объектов типа
class
. Впрочем,TObject
,TButton
и т. д. — это указатели на объект и всегда являются простыми типами!
Категории:- Типы данных
- C++
- Управление памятью
Wikimedia Foundation. 2010.