编译器是否删除模板中类型的条件语句
Does compiler remove conditionals on types in templates
考虑以下代码:
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);
或者您担心您的标准库没有得到足够的优化?
相关文章:
- 具有条件类型名的模板类
- 模板类默认类型和条件
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 对于检查 >=0 终止条件时的循环索引类型
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 在非本机类型上具有多个条件的 GDB 断点
- 用于根据条件选择编译时类型的可变参数模板
- 使用 std::条件根据模板参数选择成员类型
- GNU Radio中基于条件的输出的块类型
- 如何编译模板类型名的时条件
- 基于指针或值类型的条件类型
- 有没有一种很好的方法来实现具有默认失败情况的条件类型?
- 具有条件的C 模板非类型参数
- C 模板:如何根据数据类型有条件编译不同的代码
- 类型取决于模板中的条件
- 您可以static_assert一个元组只有一种满足特定条件的类型
- 根据编译时条件在类型之间选择类型的惯用方法
- 模板化函数范围内的条件模板化类型别名
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数