006
21.04.2006, 20:29 Uhr
~MartinF
Gast
|
Ich würde die Funktions abs anders Deklarieren und ein wenig anders Implementieren. Zunächst sollte man bedenken, dass die Multiplikation mit dem Wert -1 langsamer verläuft als die Verwendung des unären Vorzeichenoperators Minus. Des weiteren würde ich die Fkt. als inline deklarieren, damit der Compiler die Chance bekommt den Quelltext weiter zu optimieren.
Bei Verwendung der Metafunktion abs_ wird sichergestellt, dass der Wert schon zu Compilierzeiten und nicht erst bei Laufzeiten des Programms ermittelt wird. Man bedenke, dies ist nur bei konstanten Werten möglich (s. const-Deklaration im Quelltext).
C++: |
#include <iostream>
inline int abs(int a) { return a<0 ? -a : a; }
template<int a> struct abs_ { static const int value; }; template<int a> const int abs_<a>::value=a<0 ? -a : a;
int main() { const int a1=-5; const int a2=5; const int a3=0;
std::cout << abs(a1) << std::endl; std::cout << abs(a2) << std::endl; std::cout << abs(a3) << std::endl;
std::cout << abs_<a1>::value << std::endl; std::cout << abs_<a2>::value << std::endl; std::cout << abs_<a3>::value << std::endl; }
|
Die inline-Deklaration ist nur ein Hinweis für den Compiler. Ich könnte das Programm ohne Optimierung übersetzen und eine Abbildung des Profilings posten, sodass der Vorteil der Metaprogrammierung besser sichtbar wird. Ist es möglich Anhänge wie Bilder mitzuposten? Wenn ja brauch ich einen kleinen Tipp wie das funktioniert. |