LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Чтобы было более ясно и не возникало лишних обсуждений о стоимости dynamic_cast, слова самого Страуструпа из статьи, ссылка на которую дана в посте:

Dynamic casting is useful in many applications, but current implementations of this functionality are slow compared with other C++ operations. Current implementations of dynamic cast require extra type information to be kept for each class with a virtual function. When dynamic cast is called, the algorithm will traverse a data structure representing all of Actual’s base classes, searching for a match for the Target type.

Т.е. ясно сказано: требуется поиск в некоей структуре данных, а не какое-то конечное количество действий. Поиск - это как минимум логарифм, если без изысков типа как в той статье. По сравнению с этим, просто вызов виртуального метода требует фиксированного числа действий, что при одиночном, что при множественном наследовании.

Но если метод виртуальный, а переменная у нас не того класса, а предка, то сначала надо сделать dynamic_cast, который и имеет стоимость.

А в go/rust нужно в этой же ситуации получить трейт - это имеет примерно ту же стоимость.

Короче, надо в Яр просто включить структуры с одиночным наследованием и родовые функции из лиспа, и сказать, что это универсальные, но медленные родовые функции, но вы можете реализовать свои VMT. Всё равно никто пользоваться не будет и можно не бояться зоопарка из конкурирующих реализаций ООП.

Исходная версия den73, :

Чтобы было более ясно и не возникало лишних обсуждений о стоимости dynamic_cast, слова самого Страуструпа из статьи, ссылка на которую дана в посте:

Dynamic casting is useful in many applications, but current implementations of this functionality are slow compared with other C++ operations. Current implementations of dynamic cast require extra type information to be kept for each class with a virtual function. When dynamic cast is called, the algorithm will traverse a data structure representing all of Actual’s base classes, searching for a match for the Target type.

Т.е. ясно сказано: требуется поиск в некоей структуре данных, а не какое-то конечное количество действий. Поиск - это как минимум логарифм, если без изысков типа как в той статье. По сравнению с этим, просто вызов виртуального метода требует фиксированного числа действий, что при одиночном, что при множественном наследовании.

Но если метод виртуальный, а класс у нас не тот и нужен dynamic_cast, то этот-то dynamic_cast и составляет трудности.