Помощь - Поиск - Пользователи - Календарь
Полная версия: SizeOf(record)
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
sheka
Интересное кино:
const
k = 20;
type
a = record
b: string[k];
c: longint;
end;

BEGIN
writeln('k = ',k);
writeln('Size = ',sizeof(a));
readln;
END.

Выдает такой результат:
Running "d:\prog\pas\1.exe "
k = 19
Size = 24

Running "d:\prog\pas\1.exe "
k = 20
Size = 28


При чем когда c: longint; закомментировано, то результат правильный: размер = k+1;
IUnknown
Ничего интересного не вижу...
type
a = packed record ...
и все становится на свои места.
sheka
Без packed размеры каждого поля подгоняются под 4/8 байт?
IUnknown
По умолчанию работает режим {$PACKRECORDS DEFAULT}, что соответствует {$PACKRECORDS 4} (несмотря на заверения prog.pdf параграф 1.1.58, что дефолтное значение равно 2)

Update
Так... Со значением PACKRECORDS DEFAULT все в порядке. Дело в другом: в FPC 2.1.1 появился ключ {$CODEALIGN}, параметр которого принимается во внимание при выравнивании полей записи. Так вот его дефолтное значение как раз говорит, что поле типа SmallInt Будет выровнено на 2 байта, LongInt - на 4, а Int64 - на 8. Что и происходит в твоем случае, без указания packed...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.