- Код: Выделить всё
- 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. Разумеется, это дело сопровождается ошибкой защиты памяти.
Отсюда вопрос: это я что-то не то делаю или хочу странного, либо таки это баг/фича?





 .
.