Оптимизация кода шаблона для конкретных значений нетиповых параметров. - PullRequest
4 голосов
/ 30 мая 2011
template <bool flag>
class foo
{
    public:
        int bar()
        {
            if(flag)
            {
                // stuff
            }
        }
};

Когда компилятор компилирует этот класс, он заменяет параметр флага на true или false.Тогда имеем if (true) (или if (false)).Затем предложение if проверяет постоянное выражение и будет удалено во время компиляции.Могу ли я ожидать, что компиляторы будут вести себя так?

Ответы [ 3 ]

6 голосов
/ 30 мая 2011

Нет, ты не можешь.Любая оптимизация полностью зависит от компилятора.Поскольку вы используете шаблоны, вы должны написать специализацию для обоих случаев flag.

2 голосов
/ 30 мая 2011

Ожидайте, да. Полагаю, нет. Но как бы вы заметили?

Обратите внимание, что вы не можете создать экземпляр шаблона с помощью false, если вы пишете код внутри оператора if, который не компилируется, когда flag равен false. Удаление теста будет выполнено оптимизатором, который концептуально запускается после того, как компилятор выяснил, что в первую очередь означает код.

2 голосов
/ 30 мая 2011

Оптимизация зависит от компилятора. Почему бы вам не создать сборку релиза и не выполнить пошаговую разборку?

Тем не менее, это не идиоматический способ сделать это. Вы должны либо использовать специализацию шаблона, либо перегрузку метода. Они оба обеспечивают разрешение во время компиляции. Итак, в этом случае я бы предпочел последнее:

#include <type_traits>
template <bool flag>
class foo
{
public:
    int bar()
    {
        _bar(std::integral_constant<bool, flag>())
    }
private:
    int _bar(std::true_type)
    {
        // stuff
    }
    int _bar(std::false_type)
    {
        // empty
    }
};

РЕДАКТИРОВАТЬ: для этого требуется C ++ 0x, но его можно легко перевести на C ++ 98, включив boost/type_traits и изменив директивы std:: на boost::. И, конечно же, для этого потребуются библиотеки повышения.

...