IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> SizeOf(record), FreePascal
сообщение
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Интересное кино:
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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Ничего интересного не вижу...
type
a = packed record ...
и все становится на свои места.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Без packed размеры каждого поля подгоняются под 4/8 байт?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


По умолчанию работает режим {$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...

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 5:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name