Wir haben gerade angefangen, Template-Metaprogrammierung in C++ 11 zu lernen. Als Übung haben wir ein Programm geschrieben, das die binäre Darstellung eines int-Wertes ausgibt. Wir haben uns zwei mögliche Implementierungen ausgedacht. Der erste verwendet eine Rekursion mit Enum-Werten, während der zweite eine constexpr-Funktion verwendet.Metaprogrammierung mit conexpr oder struct
Unsere Erwartung war, dass beide Implementierungen zu ausführbaren Dateien derselben Größe führen. Die erste Implementierung führt jedoch zu 9064 Bytes, während die zweite 9096 Bytes enthält. Wir kümmern uns nicht um den winzigen Unterschied in Bytes, verstehen aber nicht, was den Unterschied verursacht.
Wir haben das Programm mit GCC 4.8.2 ohne Optimierungs-Flag kompiliert, jedoch die gleichen Ergebnisse gefunden die -O2-Flag.
#include <iostream>
using namespace std;
template <int val>
struct Bin
{
enum { value = 10 * Bin<(val >> 1)>::value + (val & 1) };
};
template <>
struct Bin<0>
{
enum { value = 0 };
};
constexpr int bin(int val)
{
return val == 0 ? 0 : (10 * bin(val >> 1) + (val & 1));
}
int main()
{
// Option 1
cout << Bin<5>::value << '\n'
<< Bin<27>::value << '\n';
// Option 2
cout << bin(5) << '\n'
<< bin(27) << '\n';
}
Dieses Programm sieht simpel genug aus, um zu zerlegen und zu analysieren. – Borsunho
'conexpr'-Funktionen werden nicht garantiert zur Kompilierzeit ausgewertet, es sei denn, sie werden in einem Kontext verwendet, der einen konstanten Ausdruck erfordert. –