Разрешение области для статической функции или указателя в классе шаблона

В настоящее время я работаю над кодом, написанным кем-то другим, и я не уверен в эффективности их метода. У них есть шаблонный класс, который использует разрешение области для доступа к членам класса вместо того, чтобы иметь указатель на шаблонизированный класс и обращаться к нему таким образом. Например:

template <typename T>
class A {
    void func() {
        T::DoSomething();
    }
};

class B {
    static void DoSomething() {
        // code...
    }
};

Я лично чувствую, что это затрудняет понимание класса шаблона, но моя основная область запросов - это производительность. Что является более эффективным; с использованием разрешения области или с закрытой переменной-членом A::T* p_blah и звонит Bиспользование функции p_blah->DoSomething()?

1 ответ

Решение

Разрешение области - это то, что происходит полностью во время компиляции. Метод, используемый в этом коде, приводит к прямому, встроенному вызову функции. Вы не можете победить это.

Ваше предложение:

  • Требует, чтобы экземпляр B был создан как-то
  • Требует, чтобы указатель на этот экземпляр либо сохранялся в A (увеличение его размера) или в глобальном масштабе (всегда проблематично)
  • Внедряет необходимость отслеживать время жизни этого экземпляра

Короче говоря, у него мало шансов быть таким же эффективным, как у вас сейчас.

Другие вопросы по тегам