У меня вопрос по оптимизации вызовов виртуальных функций. Я где-то читал (и проблема в том, что сейчас не могу найти статью), что можно было бы оптимизировать поиск в v-таблице, используя конструкцию, подобную этой:
// Base.h
class Base
{
public:
virtual void Foo() = 0;
};
// Concrete.h
class Concrete : public Base
{
public:
virtual void Foo()
{
// do something;
}
};
//Some.h
extern Base* const g_object;
// Some.cpp
Concrete on_stack_concrete;
Base* const g_object = &on_stack_concrete;
Предполагается, что хитрость заключается в использовании указателя const на переменную, которая размещается в стеке (не динамически), и компилятор наверняка ее оптимизирует. Таким образом, всякий раз, когда пользователь вызывает g_object->Foo(), часть //сделать что-то будет выполняться без необходимости поиска в v-таблице.
Это правда или нет?
Заранее спасибо за любой повтор.
РЕДАКТИРОВАТЬ:
Возможное использование такой конструкции заключается в ограничении интерфейса конкретных реализаций. Конечно, можно утверждать, что «ограниченные» методы должны быть закрытыми, но иногда другим модулям библиотеки требуется доступ к этим общедоступным дополнительным методам объекта, не позволяя пользователю манипулировать ими. Так, например, используя #define, можно создать код, похожий на:
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
На самом деле объявление этих классов может быть определено только в файле CPP, поэтому пользователь не знает об их существовании.
Вопрос не в том, зачем вообще использовать такой постоянный указатель, а в том, можно ли оптимизировать поиск в v-таблице в таком сценарии.