0 Tage Serie
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.