![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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" уже не пользуется - памяти навалом - чего экономить на спичках.
|