Open Multi-Methods for C++ - предложение по реализации мультиметодов в С++. Один из авторов предложения - Страуструп. В новый стандрат это предложение войдет вряд ли, а вот в качестве расширений языка к каким-нибудь компиляторам вполне может появиться.
Открытые мультиметоды работают со множественным и виртуальным наследованием, не мешают исключениям, не увеличивают накладные расходы на вызов обычных виртуальных функций.
Авторы реализовали это предложение в компиляторе EDG с помощью таблиц открытых мультиметодов. Традиционная таблица виртуальных функций, v-table, у них содержит ссылку на еще одну таблицу- om-table. Еще в статье предлагается сделать это через какие-то Chinese Remainders. Но потом они пишут, что подход этот сложный, очень уже теоретичный и плохо будет работать с большими иерархиями.
По ходу дела рассматриваются существующие реализации мультиметодов. С помощью препроцессора реализуют мультиметоды в Cmm и DoubleCpp. С помощью темплейтов - Loki.
В конце статьи приводится сравнение этой реализации с другими реализациями мультиметодов.
Approach | Size (bytes) | Cycles/Loop | Cycles/Loop |
Linux | Pentium-D | Core2Duo | |
Virtual function | n/a | 75 | 55 |
C++ Multi-method | 19 547 | 78 | 60 |
C++ Open-method | 19 725 | 82 | 63 |
EDG/Omm | 70 647 | 82 | 64 |
Double Cpp | 20 859 | 120 | 82 |
C++ Visitor | 35 289 | 132 | 82 |
Chinese Remainders | n/a | 175 | 103 |
Cmm (constant time) | 112 250 | 415 | 239 |
Cmm | 111 305 | 1 320 | 772 |
Loki Library | 34 908 | 3 670 | 2 238 |
Размер тут указан, но я так и не поняла зачем. В статье говорится, что к одним какие-то библиотеки прилинковывались, к другим нет... Ни о чем не говорит этот размер, короче. А вот со скоростью интереснее. Получается, что реализация в Loki очень тормозная по сравнению с остальными.
По ссылке с Lambda the Ultimate
Ссылки по теме:
Мультиметоды
6 коммент.:
еще немного, и C++ приблизится по гибкости к Common Lisp ;-)
CLOS - это вообще сносящая крышу придумка, если не знаете, то почитайте - это интересно
Chinese remainders -- это китайская теорема об остатках :)
а в Borland c++ 3.1 под дос это уже было!
Loki вышел тормозным потому-что они тестировали только StaticDispatcher (об этом в 7.1)- версию, работающую на dynamic_cast.
Елена, ссылка http://www.research.att.com/~bs/multimethods.pdf битая.
поправьте, если не трудно и есть на что.
2Ilya Zvyagin:
поправила, спасибо
Отправить комментарий