Почему размер записи не равен сумме размеров ее полей? - PullRequest
8 голосов
/ 21 марта 2012

У меня следующий код:

type TRecord1 = record
  myarr: array [0..31] of single:
end;
type TRecord2 = record
  b1, b2, b3, b4, b5, b6: byte;
end;
type TRecord3 = record
  myarr: array [0..31] of single:    
  b1, b2, b3, b4, b5, b6: byte;
end;

procedure TForm1.FormCreate(Sender: Tobject);
begin
  ShowMessage(IntToStr(SizeOf(TRecord1))+'+'+IntToStr(SizeOf(TRecord2))+
      '='+IntToStr(SizeOf(TRecord3)));
end;

Программа показывает следующее сообщение:

128+6=136

Почему SizeOf(TRecord3) равно 136, а не 134?

Ответы [ 2 ]

15 голосов
/ 21 марта 2012

Это связано с добавлением отступа из-за выравнивания записи.TRecord3 имеет выравнивание 4, поскольку содержит значения single.Таким образом, в конец записи добавляется заполнение, чтобы размер был кратным 4. Поэтому размер равен 136, а не ожидаемому значению 134.быть packed или, что то же самое, установить опцию компилятора выравнивания на $ALIGN 1.При выравнивании 1 к записи не будет добавлено заполнение и SizeOf(TRecord3)=134.Однако я настоятельно рекомендую вам не делать этого.Использование естественного выравнивания приводит к наиболее эффективному доступу к памяти для записей.Например, процессору дороже загружать выровненное значение, чем загружать выровненное значение.Для single или integer естественное выравнивание находится в 4-байтовом ограничении.Для double естественное выравнивание находится на 8-байтовой границе и так далее.Вы должны использовать упакованные записи, если вам нужна двоичная совместимость с другой библиотекой, которая использует упакованные записи.

4 голосов
/ 21 марта 2012

Это связано с выравниванием. Поля в записи выровнены на 4 байта или 8 байтов (или байтов, когда в записи используются только байты) таким образом, что запись, когда в массиве все поля будут продолжать выравниваться. Если вы хотите, чтобы формула работала, вы должны использовать «упакованную запись». Обратите внимание, что поля могут быть не выровнены и могут снизить производительность.

...