Właśnie rozpoczęliśmy naukę meta-programowania szablonów w C++ 11. Jako ćwiczenie napisaliśmy program, który wyprowadza binarną reprezentację wartości int. Wymyśliliśmy dwie możliwe implementacje. Pierwszy używa rekursji z wartościami wyliczonymi, podczas gdy druga metoda używa funkcji constexpr.Metaprogramowanie ze strukturą constexpr lub struct
Oczekiwaliśmy, że obydwie implementacje spowodują, że pliki wykonywalne będą tego samego rozmiaru. Jednak pierwsza implementacja prowadzi do 9064 bajtów, podczas gdy druga ma 9096 bajtów. Nie mamy nic przeciwko małej różnicy w bajtach, ale nie rozumiemy, co powoduje różnicę.
Skompilowaliśmy program z GCC 4.8.2 bez flagi optymalizacji, jednak te same wyniki są oznaczone 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';
}
Ten program wygląda na tyle uproszczony, że można go złożyć i zanalizować. – Borsunho
Funkcje 'constexpr' nie są gwarantowane podczas kompilacji, chyba że są używane w kontekście wymagającym stałego wyrażenia. –