Почему set of 0..7 занимает 4 байта?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
tovit
новенький
Сообщения: 11
Зарегистрирован: 11.09.2011 14:17:29
Откуда: Astrakhan

Почему set of 0..7 занимает 4 байта?

Сообщение tovit »

Здравствуйте.
Решил сделать модуль для работы с множествами большого размера, ведь стандартно только 256 элементов может быть в множестве.
Базовый тип :
TBitSet = set of 0..7
Моделирование большого множества :
TLargeSet = array of TBitSet //Открытый массив
PLargeSet = ^TLargeSet
При работе :
var MyLargeSet : PLargeSet;
...
MyLargeSet := nil;
N := 1024; // Мощность множества
SetSize := N div 8; //размер памяти под массив как я надеялся
if (N mod 8) <> 0 then inc (SetSize);
getmem (MyLargeSet,SetSize); //выделяем память
//работаем
freemem (MyLargeSet); //освобождаем память
MyLargeSet := nil;

И вроде бы как всё получалось, пока с удивлением не обнаружил, что
тип TBitSet занимает аж 4 байта памяти, а не один байт как я рассчитывал.
Почему так? И как можно (если можно) добиться какой-то упаковки, чтобы TBitSet занимал один байт.
Иначе затея теряет смысл.
Спасибо.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Зависит от директивы $packset, по умолчанию 4.
Можно проверить:

Код: Выделить всё

program test_set;

type
  TBitSet = set of 0..7;
  {$push}{$packset 1}
  TBitSet2 = set of 0..7;
  {$pop}

begin
  WriteLn('SizeOf(TBitSet) = ', SizeOf(TBitSet));
  WriteLn('SizeOf(TBitSet2) = ', SizeOf(TBitSet2));
  ReadLn;
end. 
tovit
новенький
Сообщения: 11
Зарегистрирован: 11.09.2011 14:17:29
Откуда: Astrakhan

Сообщение tovit »

Спасибо. Сейчас проверю.

Добавлено спустя 4 минуты 5 секунд:
Да. Получилось. Спасибо.
Для окончательного уяснения темы..
А разве не директивой ALign подобные вещи регулируются?
Как соотносятся ALIGN и packset?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

ALIGN
Кажется, ключевое слово "for records".
tovit
новенький
Сообщения: 11
Зарегистрирован: 11.09.2011 14:17:29
Откуда: Astrakhan

Сообщение tovit »

Спасибо. Разобрался. Тема закрыта.
Ответить