Почему компилятор не может оптимизировать vtable в этом случае (статическое ключевое слово / шаблон синглтона) - PullRequest
1 голос
/ 18 апреля 2019

Используя godbolt, я могу убедиться, что clang ++ и gcc ++ способны оптимизировать vtable, когда шаблон одного типа не используется со статическим ключевым словом.

#include <iostream>

class ISquare
{
public:
    virtual int square(int num) const;

    int field;
};

class Square final : public ISquare
{
public:
    int inline square(const int num) const override final
    {
        return (num * num);
    }
};

int main(const int count, char**)
{
    // compiler is not able to optimize vtable away if static keyword in sq
    static Square sq;
    const ISquare& s = sq; 

    //const Square& s = Square(); // OK compiler is smart (eliminated vtable)
    //const ISquare& s = Square(); // OK compiler is smart (eliminated vtable)

    std::cout << s.field << '\n';

    const auto r = s.square(count);
    return r;
}

Так что, если база кода сильно зависит от шаблона singletonгде метод или свободная функция возвращает ссылку на экземпляр, который не находится в локальной области, тогда удаление vtable не работает должным образом.

Следующие флаги были использованы для компиляции

-std=c++11 -Os -fno-rtti -fno-exceptions -fdata-sections -fomit-frame-pointer -ffunction-sections -Wl,--gc-sections

Демо

...