请考虑以下代码:
template<typename T>
void f(T a[])
{
if(sizeof(T) > 1)
for(...)a[i] = j
else
memset(a, j, ...
}
我认为编译器应该在编译时删除其中一个if-branches。 这是真的吗?
答案 0 :(得分:1)
由于编译器可以决定(sizeof(T) > 1)
是否将返回true,因此在编译时本身,编译器可以在没有任何分支的情况下发出机器代码(如果使用优化标志进行编译)。因此,生成的代码将具有for
循环(或由其生成的等效代码)或memset
。换句话说,结果代码不会有if-else
块(假设您使用的是智能编译器)。
答案 1 :(得分:1)
std::fill
有什么问题?
std::fill(begin(a), end(a), j);
或者您是否担心标准库不够优化?