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

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

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

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

Сообщение Лекс Айрин » 12.03.2019 19:37:21

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

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

Сообщение stanilar » 12.03.2019 20:41:37

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


Ну уж не сильно большими. Вся разница - перейти по адресу или перейти по адресу+смещение. Думаю что операция сложения в регистрах процессора проходит очень сильно быстрее перехода в другую библиотеку.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

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

Сообщение Лекс Айрин » 12.03.2019 20:45:10

stanilar, а откуда берется смещение? Это же все дело надо как-то заранее вычислить. Правда, вычисляется все это один раз, но сам факт...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение stanilar » 12.03.2019 21:02:13

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


Летят два комара. Вдруг один ушел в штопор, сделал пике, приземлился в падении. Второй к нему подлетает, спрашивает: "Что случилось".
- Да вот, муха в глаз попала.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

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

Сообщение Cheb » 12.03.2019 22:16:28

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

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

Сообщение Лекс Айрин » 12.03.2019 22:19:25

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

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

Сообщение sts » 13.03.2019 08:51:36

смещение каждый раз считывается из таблицы по индексу метода, ведь CreateOLEObject возвращает неопределенную реализацию интерфейса (а смещение зависит от реализации).
а еще есть вариант что каждый вызов метода это посылка виндового сообщения (SendMessage) с двойным копированием параметров, но это если реализация находится в другом процессе
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение Лекс Айрин » 13.03.2019 09:51:31

sts, в общем, не самый быстрый вариант. И это без учёта свопинга.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Sergei I. Gorelkin » 13.03.2019 15:20:58

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


Врапперы ничего не делают с параметрами, кроме подстройки одного из них, который self. Calling convention объявляется в описании интерфейса, а у метода реализующего класса он обязан совпадать, иначе компилятор его не найдет.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Дож » 13.03.2019 21:28:33

Проблема производительности COM интерфейсов не только в виртуальных вызовах, а ещё и в том, что при достаточно интенсивном их использовании требуется множество потокобезопасных инкрементов/декрементов числа ссылок, которые приводят к постоянным обновлениям кеша.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение Mirage » 14.03.2019 00:58:51

В критичном к производительности коде подсчет ссылок надобно отключать, т.е. переопределять методы _addref, _release. Иначе ни в какие ворота.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

Рейтинг@Mail.ru