cpp / expert
Snippet
Rekursives Template-Loop-Unrolling
Ein ausgeklügeltes Kontrollflussmuster, das den Compiler zwingt, Schleifen zur Kompilierzeit mittels Template-Rekursion auszurollen. Dies eliminiert den Runtime-Branch-Overhead für Operationen mit fester Größe.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <size_t N>struct LoopUnroller {template <typename Func>static constexpr void apply(Func&& f) {LoopUnroller<N - 1>::apply(f);f(std::integral_constant<size_t, N - 1>{});}};template <>struct LoopUnroller<0> {template <typename Func>static constexpr void apply(Func&&) {}};// Usagevoid optimize() {LoopUnroller<4>::apply([](auto i) {// Code here is unrolled at compile timeprocess_element(i.value);});}
Erklärung
1
f(std::integral_constant<size_t, N - 1>{});
Übergibt den Schleifenindex als Kompilierzeit-Konstante, sodass die Lambda-Funktion diesen in statischen Kontexten verwenden kann.
2
template <> struct LoopUnroller<0>
Der Basisfall der Rekursion, der den Unrolling-Prozess beendet.