Убирает ли компилятор условия для типов в шаблонах - PullRequest
0 голосов
/ 23 февраля 2012

Рассмотрим код ниже:

template<typename T>
void f(T a[])
{

    if(sizeof(T) > 1)
        for(...)a[i] = j
    else
        memset(a, j, ...
}

Я думаю, что компилятор должен удалить одну из ветвей if во время компиляции. Это правда?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Что не так с std::fill?

std::fill(begin(a), end(a), j);

или вы беспокоитесь, что ваша Стандартная библиотека недостаточно оптимизирована?

1 голос
/ 23 февраля 2012

Поскольку компилятор может решить, вернет ли (sizeof(T) > 1) значение true или нет, во время самой компиляции компилятор может генерировать машинный код без какой-либо ветви, если он компилируется с включенным флагом оптимизации.Таким образом, результирующий код будет иметь либо for цикл (или эквивалентный код, сгенерированный из него), либо memset.Другими словами, результирующий код не будет иметь блока if-else (при условии, что вы используете умный компилятор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...