пятница, февраля 22, 2008

Статья Open Multi-Methods for C++

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

Ссылки по теме:
Мультиметоды

4 коммент.:

Alex Ott комментирует...

еще немного, и C++ приблизится по гибкости к Common Lisp ;-)
CLOS - это вообще сносящая крышу придумка, если не знаете, то почитайте - это интересно

lispnik комментирует...

Chinese remainders -- это китайская теорема об остатках :)

Анонимный комментирует...

а в Borland c++ 3.1 под дос это уже было!

DreamForger комментирует...

Loki вышел тормозным потому-что они тестировали только StaticDispatcher (об этом в 7.1)- версию, работающую на dynamic_cast.