Упакованные компоненты

Начиная с версии Ehp2 7.0 (ABAP Kernel 7.20) в ABAP появилась возможность использования так называемых упакованных компонентов. Объявить структуру с использованием упакованных компонентов мы можем как локально, с помощью ключевого слова BOXED, так и в словаре, выбрав тип типизации:

Boxed in dictionary

В роли упакованных компонентов могут выступать как простые структуры, так и глубокие структуры (содержащие набор компонентов или другие вложенные структуры), а так же структурные атрибуты классов и интерфейсов. При копировании структур с помощью оператора INCLUDE TYPE|STRUCTURE атрибут BOXED копируется.

Упакованные компоненты позволяют сократить объем выделенной памяти в программе. Достигается это за счёт того что под упакованные компоненты память выделяется только при их реальном использовании (см. ниже). Для обычных же компонентов объявленных через оператор TYPE (не TYPE REF TO), память выделяется автоматически при их инициализации.

Согласно документации, выделение памяти под упакованные компоненты происходит в следующих случаях:

  • Во время записи
  • Во время присвоения ссылочному полю (Field Symbols)
  • Когда компонент передается в любую из подпрограмм (процедуры и т.п.)
  • Когда мы получаем доступ через ссылочную переменною (GET REFERENCE OF)

Операторы CLEAR и FREE не возвращают упакованные компоненты в первоначальное состояние (не сбрасывают выделенную память), а только приводят их компоненты в исходное (initial) состояние.

Пример выделения памяти для структур с разными типами и ссылочной переменной:

В результате система выделит память следующим образом:

Выделение памяти

 

Для упакованного компонента система выделяет 8 байт для хранения ссылки на оригинальную структуру.

В качестве еще одного примера рассмотрим небольшую программу для получения данных о поставщиках и их телефонных номерах:

В тестовых данных моей системы существуют такие поставщики, у которых нет информации о телефонных номерах, соответственно выделение памяти под эти данные не имеет смысла. После заполнения внутренних таблиц мы имеем следующий результат по выделению памяти:

Выделенная память

 

Как видно из рисунка, после выполнения выборки, под вторую таблицу выделено гораздо меньше памяти, за счёт использования упакованных компонентов. Кроме того что использование упакованных компонентов может снизить объем выделенной памяти (в тяжелых случаях избавить от дампов при выделении памяти 🙂 ), их использование так же может ускорить время выполнения программы, за счёт копирования только внутренней ссылки, без копирования дополнительных данных, при операциях над структурными переменными.

Пример того как упакованные компоненты могут быть использованы в классах: