Как интерфейсы устроены "под капотом"?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

stanilar,прежде всего бОльшими накладными расходами. А так все равно в итоге это импорт процедур.
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

Лекс Айрин писал(а):бОльшими накладными расходами


Ну уж не сильно большими. Вся разница - перейти по адресу или перейти по адресу+смещение. Думаю что операция сложения в регистрах процессора проходит очень сильно быстрее перехода в другую библиотеку.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

stanilar, а откуда берется смещение? Это же все дело надо как-то заранее вычислить. Правда, вычисляется все это один раз, но сам факт...
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

Лекс Айрин писал(а):Это же все дело надо как-то заранее вычислить.


Летят два комара. Вдруг один ушел в штопор, сделал пике, приземлился в падении. Второй к нему подлетает, спрашивает: "Что случилось".
- Да вот, муха в глаз попала.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

Не, расходы - в неявных функциях-врапперах. Вызывая метод через интерфейс - вызываешь на самом деле враппер, который добавляет смещение и вызывает уже реальный метод класса.
Вроде бы вес комара.
Но! Враппер же методу должен передать все параметры. А если их много? В регистрах - не передашь: вычисление смещения использует регистры.
А, кстати, какой у враппера по умолчанию calling convention? Наверняка же что-то сишное, для ФП неродное. Значит, для передачи параметров их надо перепаковывать в родной паскалевский формат.
И вот на этом-то и набирается.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

stanilar, не смешно. Все точки перехода пересчитываются при загрузке программы в память, если они не абсолютны, плюс, переход или вызов подпрограммы сбрасывают очередь команд. Уже частично декорированную. Конечно, существуют мелодики избежать сброса очереди, но сам факт очень настораживает.
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

смещение каждый раз считывается из таблицы по индексу метода, ведь CreateOLEObject возвращает неопределенную реализацию интерфейса (а смещение зависит от реализации).
а еще есть вариант что каждый вызов метода это посылка виндового сообщения (SendMessage) с двойным копированием параметров, но это если реализация находится в другом процессе
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

sts, в общем, не самый быстрый вариант. И это без учёта свопинга.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Cheb писал(а):Но! Враппер же методу должен передать все параметры. А если их много? В регистрах - не передашь: вычисление смещения использует регистры.А, кстати, какой у враппера по умолчанию calling convention? Наверняка же что-то сишное, для ФП неродное. Значит, для передачи параметров их надо перепаковывать в родной паскалевский формат.


Врапперы ничего не делают с параметрами, кроме подстройки одного из них, который self. Calling convention объявляется в описании интерфейса, а у метода реализующего класса он обязан совпадать, иначе компилятор его не найдет.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Проблема производительности COM интерфейсов не только в виртуальных вызовах, а ещё и в том, что при достаточно интенсивном их использовании требуется множество потокобезопасных инкрементов/декрементов числа ссылок, которые приводят к постоянным обновлениям кеша.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

В критичном к производительности коде подсчет ссылок надобно отключать, т.е. переопределять методы _addref, _release. Иначе ни в какие ворота.
Ответить