LINUX.ORG.RU

Сообщения binnehex

 

[scheme] рекурсия против итерации

Привет все. Тут такое дело, чего то я недопонимаю ...

Имеется две реализации !

% cat tttt.scm
#!/usr/bin/env gsi-script

(define factorial-1
 (lambda (n)
  (if (zero? n)
   1
   (* n (factorial-1 (- n 1))))))

(define factorial-2
 (lambda (n)
  (let iteration ((i n)
                  (p 1))
   (if (zero? i)
    p
    (iteration (- i 1) (* p i))))))

(time (factorial-1 16384))
(newline)
(time (factorial-2 16384))

Причем вторая работает медленнее, хотя я ожидал что она будет
быстрее.

% ./tttt.scm
(time (factorial-1 16384))
    1376 ms real time
    1297 ms cpu time (891 user, 406 system)
    139 collections accounting for 417 ms real time (273 user, 141 system)
    206481088 bytes allocated
    62384 minor faults
    no major faults

(time (factorial-2 16384))
    1844 ms real time
    1734 ms cpu time (1242 user, 492 system)
    762 collections accounting for 818 ms real time (625 user, 141 system)
    228843664 bytes allocated
    67161 minor faults
    no major faults

Как же tail call optimisation и все такое? Поясните если можно.

 

binnehex
()

C++, классы в подружаемых .so

Есть некоторый класс, объявленный и реализованный в .cc файле.
В этом же файле есть глобальные функции createClass, deleteClass.
Этот .cc файл компилируется в .so модуль и затем подгружается в
основную программу. Вопрос такой: как можно определить реализует ли
этот класс, в загруженном .so, определенный интерфейс.

class ModuleManager {
    public:
        template <class T_Interface>
        T_Interface* findModuleForInterface() const
        {
            // for each of loaded modules {
            //   if loaded module implements T_Interface {  // <- ??
            //     if module instance is 0 {
            //       create module instance
            //     }
            //     return module instance
            //   }
            // }
            // return 0
        }
};

Если добавить в .cc файл модуля еще одну функцию:
bool probeClass(const std::type_info& pInfo)
{
  return strcmp(typeid(SupportedIfaceA).name(), pInfo.name()) == 0 ||
         strcmp(typeid(SupportedIfaceB).name(), pInfo.name()) == 0;
}
Все вроде бы получается. Но только на std::type_info::name()
рассчитывать нельзя.

Как вообще правильно реализуется такое на C++ (приложение работает
с абстрактными интерфейсами; реализации интерфейсов загружаются из
.so файлов; поиск реализации для заданного интерфейса)?
binnehex
()

RSS подписка на новые темы