- Код: Выделить всё
PDataItem = ^TDataItem;
TDataItem = record
Kind: Integer;
Base: Int64;
Data: Pointer;
end;
и когда дело доходит до выяснения её размера, с удивлением обнаруживаю, что это 24 байта. Ладно, пусть фрипаскаль выравнивает все поля на начало слова (8-байтного!!!). Тогда объявляю так:
- Код: Выделить всё
PDataItem = ^TDataItem;
TDataItem = record
Base: Int64;
Kind: Integer;
Data: Pointer;
end;
Опаньки - размер уже 16, как и ожидалось. Я рад, вот только когда ничинаешь пользоваться таким объявлением:
- Код: Выделить всё
pNewData := PDataItem(pNewRow + FDataOffset + SizeOf(TDataItem) * i);
pNewData^.Kind := ...;
pNewData^.Base := ...;
pNewData^.Data := ...;
наш дорогой компилятор всё также продолжает считать, что поля выровнены на границу Int64, т.е. размер записи - 24. Разумеется, это дело сопровождается ошибкой защиты памяти.
Отсюда вопрос: это я что-то не то делаю или хочу странного, либо таки это баг/фича?