Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Неправильно определяется размер...

Аноним
Программа считывает шапку .ВМР файла.
type THeader = record
BM: Word
BMPSize: LongWord
Reserved1: Word
Reserved2: Word
BMPOffset: LongWord
end;
Должно получиться 14 байт. Но программа упорно заявляет SizeOf (THeader) = 16
Помогите, пожалуйста. Это глюк или так и должно быть, тогда почему.
591
09 декабря 2001 года
x77
40 / / 20.03.2000
Да, это сильный прикол. Если ты будешь поочерёдно "ремить" объявленные в записи поля, ты удивишься ещё больше. Например, если оставить только BM, размер будет 2. Добавить BMPSize - 8, хотя должен быть 6, добавить Reserved1 - 12, добавить Reserved2 - снова 12 (?!!), и т.д.

Это связано с управлением памяти в Delphi. Для таких типов, как записи (и нек. др.) значения выравниваются по границам word и dword для более быстрого доступа. Объяви свой record вот так:

t = record
BM: Word;
BMPSize: LongWord;
Reserved1: Word;
BMPOffset: LongWord;
Reserved2: Word;
end;

и SizeOf (t) будет равно 20! (забавно, правда?).

Этого всего можно избежать, если использовать ключевое слово packed, данные будут сжаты (именно за счёт того, что выравнивания по гранцам word и dword делаться не будет). Якобы из-за этого они могут медленнее работать. Для строковых массивов это может привести к проблемам совместимости. Короче, см. в справке packed и Memory Management.
449
11 декабря 2001 года
Fantasist
124 / / 20.06.2000
Вот это круто!! Я даже и не знал. Правда и с проблеиой такой не сталкивался.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог