编译器是否删除模板中类型的条件

时间:2012-02-23 06:54:31

标签: c++ templates

请考虑以下代码:

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

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

我认为编译器应该在编译时删除其中一个if-branches。 这是真的吗?

2 个答案:

答案 0 :(得分:1)

由于编译器可以决定(sizeof(T) > 1)是否将返回true,因此在编译时本身,编译器可以在没有任何分支的情况下发出机器代码(如果使用优化标志进行编译)。因此,生成的代码将具有for循环(或由其生成的等效代码)或memset。换句话说,结果代码不会有if-else块(假设您使用的是智能编译器)。

答案 1 :(得分:1)

std::fill有什么问题?

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

或者您是否担心标准库不够优化?