LINUX.ORG.RU

Ответ на: комментарий от quasimoto

нестатический метод (= метод объекта) (= метод инстанса) можно диспетчеризовать с *разной* скоростью

допустим у нас есть

inherit_from<A,B> x = .... ;
x.some_instance_method(123);

в полноценном языке

1. если удается на этапе компиляции определить, что some_instance_method имеет известный на этапе компиляции адрес, то он должен вызываться

2. иначе на этапе компиляции необходимо обязательно определить какому из классов — А или В — принадлежит some_instance_method, и в рантайме вызывать его из vtbl соответствующего класса

здесь возможна подделка — использовать интерфейсы (интерфейсы в смысле JVM), у которых диспетчеризация медленнее, т.к. там индексация идет не по целому числу (а кстати как? наверно обращением в хэш-массив)

пункт 3, «в рантайме определять какому из классов — А или В — принадлежит some_instance_method», я считаю бессмысленным

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

А можешь на пальцах объяснить откуда возникают такие сложности? Мне вот не понятно:

1) Что значит «нестатический метод (= метод объекта) (= метод инстанса)»? Что вообще такое статический метод? Это не метод объекта или инстанса?

2) Ещё не понял насчёт (1) и (2) - про абстрактные/виртуальные методы и виртуальную таблицу я знаю, но всегда думал что там в случае статического решения во времени компиляции всегда работает (1) т.е. генерируется вызов специфичного метода с всегда известным адресом. Ведь в случае непараметрического полиморфизма все специфичные методы имеют заранее известный адрес.

Задача статической диспетчеризации это ведь всегда задача установки типов (в смысле классов) всех аргументов методов (если нет мультиметодов - одного аргумента) во время компиляции - разве это нельзя сделать в любом случае, если язык статически типизирован?

пункт 3, «в рантайме определять какому из классов — А или В — принадлежит some_instance_method», я считаю бессмысленным

Этим ты убиваешь настоящее ООП. Игры в таблички, когда разные функции можно обзывать одним именем и диспетчеризировать по классам это конечно хорошо. Но есть ещё мультиметоды и подход при котором определить объекты каких классов мы имеем можно только во время выполнения (т.е. что-то там недетерминистично, например IO). Методы диспетчеризации во время выполнения тоже бывают *разные*, например Efficient Method Dispatch in PCL.

Т.е. есть подход динамического ООП (не то чтобы там было что-то не оптимально - там специально выбирают рулить методами во время выполнения и иметь возможность горячего обновления схемы классов и методов). И другой фундаментальный подход - языки с формальными системами типов, в них нет никакого специального средства установить каких типов термы - эта возможность сама постулат и не требует специальных средств. И в первом и во втором случае вроде нет предмета для спора, есть какие-то проблемы именно в С++?

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.