72
12.2. Вътрешно представяне на данните
12.2.2. Пакетирани променливи
В UniPascal пакетирането оказва съществено влияние на представянето на
променливите, масивите и структурите. Пакетиране се предприема, само ако то е явно
указано и ако е възможно.
Типът Т ще наричаме пакетиран, ако е указано пакетирането му и освен това, ако
в него има поне един пакетируем елемент.
Типа T ще наричаме пакетируем, ако е изпълнено едно от следните условия:
*
Типът T е дискретен тип (целочислен, логически, символен, изброим или
диапазонен) и освен това минималната и максималната му стойност лежат
(и двете едновременно) в един от двата интервала [0..255] или [-128..127];
*
Типът T е структуриран, като всички негови елементи (ако е масив) или
всички полета (ако е запис) са пакетирани и пакетируеми. Освен това е
указано пакетиране за този тип, т.е. той е и пакетиран.
От тези две определения следва, че един тип може да бъде пакетиран, но
непакетируем. Непакетируемостта се въвежда, за да се обясни кои масиви могат да
бъдат пакетирани и кои не и за да се поясни начина на пакетиране при записите. Ако
елементите на масив са непакетируеми, то указанието за пакетиране (ключовата дума
PACKED) се игнорира. Указанието за пакетиране се игнорира също и ако всички полета
на даден запис са непакетируеми. За непакетируемите елементи се отделя място на
граница на дума. Затова, ако те са елементи на масив, то той не е пакетиран. А ако е
поле от запис, то адресът му е изравнен на граница на дума, останалите полета са
пакетирани, ако са пакетируеми.
Примери:
packed array [0..5] of char;
е пакетиран и пакетируем масив;
packed array [0..5] of integer;
е непакетиран масив;
packed record x, y: shortcard; end;
е пакетируем (и пакетиран) запис, т.е. може да се използва като
елемент на пакетиран масив (или запис);
packed record x, y: shortcard; i: integer; end;
е пакетиран но непакетируем запис, т.е. ако се използва като елемент
на масив, то указването на PACKED ще бъде игнорирано за масива.
Освен това пакетируемостта оказва съществено влияние на начина, по който се
пакетират записи. Пакетируемите полета на запис могат да започват на граница на байт,
докато непакетируемите полета са изравнени на граница на дума.
По-долу се дава представянето на стандартните типове при пакетиране.
Изброим тип
Стойностите на константите от изброим тип се представят като цели числа в
диапазона 0..N-1, където N е броят на константите от изброимия тип. Обикновено
представянето заема един байт и в такъв случай е пакетируемо, тъй като броят на
константите рядко е по-голям от 256.
<<  <  GO  >  >>

Вернуться к началу сайта