Но по анатомии интерфейсов - ничего не находится, кроме ссылок на стандартные способы работы с ними.
Но хороший паскалист должен знать, как оно устроено там, внутри.
Пытался сделать сериализацию, как уже сделал для объектов. Ниасилил (без уродливых костылей, по крайней мере).
Размер TInterfacedObject - 12 байт, против 4 у TObject, НО! Я уже выяснил экспериментальным путём, что ФП расточительно расходует память в процессе наследования: размеры классов выравниваются на 8 байт, что часто приводит к неиспользуемым дыркам между полями наследника и предка. Таким образом, расклад TInterfacedObject скорее всего: 4 байта указатель на VMT / 4 байта просрано / 4 байта интерфейс).
Базовые исследования показали: переменная типа интерфейс - это такая же ссылка, указывает куда-то внутрь экземпляра класса. В случае моих экспериментов - по смещению 8 от начала. По этому адресу - тоже ссылка, но уже на неизвестно что. В принципе, VMT и это неизвестно-что расположены достаточно близко друг к другу (например, 00426028 и 004260B4).
Попытки парсить память уже по этому указателю (там, в свою очередь, оказался массив указателей) дают следующую картину:
- Код: Выделить всё
(00402150) 04246C83 F726E908 0000FFFF 00000000
(00402160) 04246C83 F636E908 0000FFFF 00000000
(00402170) 04246C83 F686E908 0000FFFF 00000000
(30427B26)An unhandled exception occurred at $00401B62:
EAccessViolation: Access violation
-- до боли похоже на VMT, тем более, что методов в том интерфейсе - как раз три.
Так вот, вопрос: у кого нибудь есть ссылки на материалы по тому, как устроена эта "интерфейсовая VMT" и с чем её едят?
Вполне возможно, что материалы по ЦПП подойдут: интерфейсы ведь, теоретически, это кросс-языковый стандарт.