cpp / expert
Snippet
Maskenbasierte Auswahl für verzweigungsfreie Auswertung
Verzweigungen (if/else) können aufgrund von Fehlvorhersagen Pipeline-Stalls verursachen. C++-Experten verwenden oft bitweise Masken für die Auswahl. Wenn die Bedingung 1 ist, wird die Maske zu 0xFFFFFFFF, was den 'True'-Wert wählt. Bei 0 ist die Maske 0x00000000, wodurch der 'False'-Wert über das bitweise ODER gewählt wird.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
int safe_select(int condition, int true_val, int false_val) {// condition must be 0 or 1int mask = -condition;return (true_val & mask) | (false_val & ~mask);}// Usage for performance-critical clampsint fast_clamp(int val, int min, int max) {val = safe_select(val < min, min, val);val = safe_select(val > max, max, val);return val;}
Erklärung
1
int mask = -condition;
Nutzt das Zweierkomplement: -1 besteht aus lauter 1en, -0 aus lauter 0en.
2
(true_val & mask) | (false_val & ~mask)
Kombiniert die maskierten Werte zu einem Ergebnis ohne Sprungbefehl.