C++ 11'de şablon meta programlamayı öğrenmeye başladık. Bir egzersiz olarak, bir int değerinin ikili temsilini veren bir program yazdık. İki olası uygulama ile geldik. Birincisi enum değerleri ile özyinelemeyi kullanırken, ikinci yöntem bir constexpr fonksiyonu kullanmaktadır.Constexpr veya struct ile metaprogramlama
Bizim beklentimiz her iki uygulamanın da aynı boyutta çalıştırılabilir sonuçlarla sonuçlanmasıydı. Bununla birlikte, ilk uygulama 9064 bayta, ikincisi ise 9096 bayta ulaşır. Baytlardaki küçük farkı önemsemeyiz, ancak farkın nedenini anlamıyoruz.
Programı GCC 4.8.2 ile optimizasyon bayrağı olmadan derledik, ancak aynı sonuçları -O2 bayrağı bulduk.
#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';
}
Bu program, dağıtmak ve analiz etmek için yeterince basit görünüyor. – Borsunho
'constexpr' işlevlerinin, sabit bir ifade gerektiren bir bağlamda kullanılmadığı sürece derleme zamanında değerlendirilmeleri garanti edilmez. –