Хотя никто из гуру FPC не имеет времени ответить, позволяет изучить этот вопрос. Вот код для этого:
program Project1;
type
TByteArray = packed array[Low(Word)..High(Word)] of Byte;
PByteArray = ^TByteArray;
TMyRec = packed record
f1, f2, f3, f4, f5, f6, f7, f8: Byte;
end;
{ TMyClass1 }
TMyClass1 = class
mark1: Byte;
f1, f2, f3, f4, f5, f6, f7, f8: Byte;
mark2: Byte;
r: TMyRec;
mark3: Byte;
constructor Create;
procedure ShowMe; // Dump of the object's data
end;
{ TMyClass1 }
constructor TMyClass1.Create;
begin
mark1 := 66;
mark2 := 77;
mark3 := 88;
end;
procedure TMyClass1.ShowMe;
var
data: PByteArray;
i: Word;
begin
data := Pointer(Self);
for i := 0 to 15 + 4 + 3 do // 4 - some unknown data at the beginning of the class, 3 - marks
Writeln(data^[i]);
end;
var
test: TMyClass1;
begin
test := TMyClass1.Create;
try
test.ShowMe;
Readln;
finally
test.Free;
end;
end.
И выход:
0
192
64
0
66 <- Data starts, simple fields
0
0
0
0
0
0
0
0
77 <- Second data portion, record
0
0
0
0
0
0
0
0
88 <- Data ends
Как мы видим, в обоих случаях 8 полей занимает 8 байт.
Удачи.
Не было необходимости в демонстрации. Записи - ** типы значений **, классы - ** ссылочные типы **. Вот почему я всегда, хотя примитивный TList в RTL или FCL должен быть записью, а затем только завернутый как класс с виртуальными методами и всеми медленными вещами. –
@Nestedtype Просто прочитайте вопрос еще раз: «_which является эффективным, меньше памяти: байтовые поля или поле записи? _ (Оба в классе)« Но я абсолютно согласен с вами: более простые типы создают более эффективный код :) – Abelisto
Да, i пропустить _both в классе_. Я думаю, что в другом ответе кто-то не был уверен, что макет памяти будет точно таким же, извините, может быть, это не ваше. –