コンパイル時に定数を計算するための 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
}
}
コンパイラは何をしますか(仮定-O3
)?コンパイラf<0>()
は、 が常に最初のケースでf<32>()
分岐し、常に 2 番目のケースでf<64>()
分岐し、常に 3 番目のケースで分岐することを認識しています。
コンパイラは、常に になるブランチを削除しますfalse
か? 唯一の有効なケースに直接分岐しますか?