cpp / expert
Snippet
Template-basiertes Loop-Unrolling
Diese Technik nutzt variadische Templates und Fold-Expressions, um eine Schleife zur Kompilierzeit in eine Folge von Funktionsaufrufen zu expandieren. Dies eliminiert den Branch-Overhead in performancekritischem Code.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>#include <utility>template <size_t... Is, typename F>void static_for(std::index_sequence<Is...>, F&& func) {(func(std::integral_constant<size_t, Is>{}), ...);}template <size_t N, typename F>void unroll(F&& func) {static_for(std::make_index_sequence<N>{}, std::forward<F>(func));}int main() {unroll<4>([](auto i) {std::cout << "Static index: " << i << "\n";});}
Erklärung
1
std::index_sequence<Is...>
Eine Liste von Ganzzahlen zur Kompilierzeit, die die Expansion des Template-Packs steuert.
2
(func(std::integral_constant<size_t, Is>{}), ...);
Eine Fold-Expression, die das Lambda für jeden Index in der Sequenz nacheinander aufruft.