Как интерфейсы устроены "под капотом"?
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
stanilar,прежде всего бОльшими накладными расходами. А так все равно в итоге это импорт процедур.
Лекс Айрин писал(а):бОльшими накладными расходами
Ну уж не сильно большими. Вся разница - перейти по адресу или перейти по адресу+смещение. Думаю что операция сложения в регистрах процессора проходит очень сильно быстрее перехода в другую библиотеку.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
stanilar, а откуда берется смещение? Это же все дело надо как-то заранее вычислить. Правда, вычисляется все это один раз, но сам факт...
Лекс Айрин писал(а):Это же все дело надо как-то заранее вычислить.
Летят два комара. Вдруг один ушел в штопор, сделал пике, приземлился в падении. Второй к нему подлетает, спрашивает: "Что случилось".
- Да вот, муха в глаз попала.
Не, расходы - в неявных функциях-врапперах. Вызывая метод через интерфейс - вызываешь на самом деле враппер, который добавляет смещение и вызывает уже реальный метод класса.
Вроде бы вес комара.
Но! Враппер же методу должен передать все параметры. А если их много? В регистрах - не передашь: вычисление смещения использует регистры.
А, кстати, какой у враппера по умолчанию calling convention? Наверняка же что-то сишное, для ФП неродное. Значит, для передачи параметров их надо перепаковывать в родной паскалевский формат.
И вот на этом-то и набирается.
Вроде бы вес комара.
Но! Враппер же методу должен передать все параметры. А если их много? В регистрах - не передашь: вычисление смещения использует регистры.
А, кстати, какой у враппера по умолчанию calling convention? Наверняка же что-то сишное, для ФП неродное. Значит, для передачи параметров их надо перепаковывать в родной паскалевский формат.
И вот на этом-то и набирается.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
stanilar, не смешно. Все точки перехода пересчитываются при загрузке программы в память, если они не абсолютны, плюс, переход или вызов подпрограммы сбрасывают очередь команд. Уже частично декорированную. Конечно, существуют мелодики избежать сброса очереди, но сам факт очень настораживает.
смещение каждый раз считывается из таблицы по индексу метода, ведь CreateOLEObject возвращает неопределенную реализацию интерфейса (а смещение зависит от реализации).
а еще есть вариант что каждый вызов метода это посылка виндового сообщения (SendMessage) с двойным копированием параметров, но это если реализация находится в другом процессе
а еще есть вариант что каждый вызов метода это посылка виндового сообщения (SendMessage) с двойным копированием параметров, но это если реализация находится в другом процессе
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
sts, в общем, не самый быстрый вариант. И это без учёта свопинга.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Cheb писал(а):Но! Враппер же методу должен передать все параметры. А если их много? В регистрах - не передашь: вычисление смещения использует регистры.А, кстати, какой у враппера по умолчанию calling convention? Наверняка же что-то сишное, для ФП неродное. Значит, для передачи параметров их надо перепаковывать в родной паскалевский формат.
Врапперы ничего не делают с параметрами, кроме подстройки одного из них, который self. Calling convention объявляется в описании интерфейса, а у метода реализующего класса он обязан совпадать, иначе компилятор его не найдет.
Проблема производительности COM интерфейсов не только в виртуальных вызовах, а ещё и в том, что при достаточно интенсивном их использовании требуется множество потокобезопасных инкрементов/декрементов числа ссылок, которые приводят к постоянным обновлениям кеша.
