Abbiamo appena iniziato a imparare la meta programmazione dei modelli in C++ 11. Come esercizio abbiamo scritto un programma che emette la rappresentazione binaria di un valore int. Abbiamo pensato a due possibili implementazioni. Il primo utilizza la ricorsione con valori enum mentre il secondo metodo utilizza una funzione constexpr.Metaprogrammazione con constexpr o struct
La nostra aspettativa era che entrambe le implementazioni risultassero in eseguibili della stessa dimensione. Tuttavia, la prima implementazione porta a 9064 byte mentre la seconda ha 9096 byte. Non ci importa la piccola differenza in byte, ma non capiamo cosa causa la differenza.
Abbiamo compilato il programma con GCC 4.8.2 senza flag di ottimizzazione, tuttavia, gli stessi risultati si trovano il flag -O2.
#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';
}
Questo programma sembra abbastanza semplice da smontare e analizzare. – Borsunho
Le funzioni 'constexpr' non sono garantite per essere valutate in fase di compilazione a meno che non vengano utilizzate in un contesto che richiede un'espressione costante. –