|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Выделение памяти для записей
У меня следующий код:
Код:
type TMyRecord = record A: Byte; B: Integer; C: Byte; end; TMyRecord2 = record A: Byte; C: Byte; B: Integer; end; TMyRecord3 = packed record A: Byte; B: Integer; C: Byte; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(SizeOf(TMyRecord))); ShowMessage(IntToStr(SizeOf(TMyRecord2))); ShowMessage(IntToStr(SizeOf(TMyRecord3))); end; lmikle: Пользуемся тегами!!! В результате появляются сообщения з числами: "12", "8", "6". Объясните, откуда взялись эти числа, то есть как выделяется память для записей? |
#2
|
|||
|
|||
Дело связанно с выравниванием.
Там, где packed - выравнивания нет. В остальных случаях - есть. Причем выравнивание, похоже, идет по полям. |
#3
|
|||
|
|||
В этом случае память никак не выделяется. Через функцию SizeOf определяется сколько байт памяти может занимать каждая из структур. Только и всего.
Не забывайте делать резервные копии |
#4
|
|||
|
|||
А как именно работает это выравнивание?
|
#5
|
|||
|
|||
Никак оно не работает. Оно либо есть, либо нет (при наличии служебного слова packed). Структура выравнивается компилятором до word или double-word (кратным 4-м или 8 байтам). Программерам об этом задумываться нет необходимости. Borland предупреждает, что доступ к не выравненным (сжатым) структурам работает медленнее, чем к выравнененным. Вот и все дела. Сейчас никто этим "packed" уже не пользуется - памяти навалом - чего экономить на спичках.
Не забывайте делать резервные копии |