Loop-unrolling
-
Warum macht man Loop-Unrolling eigentlich immer mit Hilfe von Templaterekursionen? Könnte der Compiler nicht einfach auch selber eine stinknormale Schleife entrollen, wenn die obere Grenze der for-Schleife eine Compilezeitkonstante ist? Das sollte für den ja eigentlich einfacher sein, oder?
-
Zum Beispiel Potenzen:
template<unsigned N, typename Type> struct Power { static Type of(Type value) { return value * Power<N - 1, Type>::of(value); } }; template<typename Type> struct Power<0, Type> { static Type of(Type value) { return static_cast<Type>(1); } };
Wäre nicht
template<unsigned N, typename Type> Type power(Type t) { Type ret = static_cast<Type>(1); for(unsigned i = N; i != 0; --i) ret *= t; return ret; }
genau so einfach entrollbar für den Compiler?
-
ob dein Compiler das kann, kannst du ja ausprobieren.
Der gcc mit -O2 -funroll-loops entrollt das untere Beispiel jedenfalls.