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

Does compiler remove conditionals on types in templates

本文关键字:类型 条件 语句 是否 删除 编译器      更新时间:2023-10-16

考虑以下代码:

template<typename T>
void f(T a[])
{
    if(sizeof(T) > 1)
        for(...)a[i] = j
    else
        memset(a, j, ...
}

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

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

std::fill出了什么问题?

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

或者您担心您的标准库没有得到足够的优化?