Vin*_*ent 3 c++ optimization templates if-statement c++11
我知道C++中的一些元编程技术可以在编译时计算常量.元函数中的大多数时间分支是通过三元运算符完成的,可以在编译时以与标准if/else相反的方式进行评估.
但是关于这种功能:
template <unsigned int N>
void f()
{
if (N == 0) {
// Some computations here
} else if (N <= 42) {
// Some computations here
} else {
// Some computations here
}
}
Run Code Online (Sandbox Code Playgroud)
编译器会做什么(假设-O3
)?编译器知道f<0>()
将始终在第一种情况下f<32>()
分支,将始终在第二种情况下f<64>()
分支,并且将始终在第三种情况下分支.
编译器会删除永远存在的分支false
吗?它会直接分支到唯一有效的案例吗?
优化器将删除未使用分支中的分支和代码,但要注意:编译器需要在优化器甚至有机会查看代码之前处理该函数,这意味着所有分支必须对所有分支都有效(可编译)价值观N
.
例如,如果第二个分支包含:
} else if (N <= 42) {
char data[50 - N];
// other code
Run Code Online (Sandbox Code Playgroud)
N >= 50
即使优化程序将删除分支,编译器也无法实例化模板.
归档时间: |
|
查看次数: |
868 次 |
最近记录: |