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

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

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

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

Сообщение tovit » 04.03.2020 19:25:22

Здравствуйте.
Решил сделать модуль для работы с множествами большого размера, ведь стандартно только 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 занимал один байт.
Иначе затея теряет смысл.
Спасибо.
tovit
новенький
 
Сообщения: 11
Зарегистрирован: 11.09.2011 14:17:29
Откуда: Astrakhan

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

Сообщение iskander » 04.03.2020 19:44:34

Зависит от директивы $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. 
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение tovit » 04.03.2020 19:58:11

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

Добавлено спустя 4 минуты 5 секунд:
Да. Получилось. Спасибо.
Для окончательного уяснения темы..
А разве не директивой ALign подобные вещи регулируются?
Как соотносятся ALIGN и packset?
tovit
новенький
 
Сообщения: 11
Зарегистрирован: 11.09.2011 14:17:29
Откуда: Astrakhan

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

Сообщение iskander » 04.03.2020 20:09:07

ALIGN
Кажется, ключевое слово "for records".
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение tovit » 04.03.2020 20:16:16

Спасибо. Разобрался. Тема закрыта.
tovit
новенький
 
Сообщения: 11
Зарегистрирован: 11.09.2011 14:17:29
Откуда: Astrakhan


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru