Chúng tôi chỉ mới bắt đầu học mẫu lập trình meta trong C++ 11. Như một bài tập, chúng tôi đã viết một chương trình xuất kết quả đại diện nhị phân của một giá trị int. Chúng tôi đã đưa ra hai triển khai có thể. Việc đầu tiên sử dụng đệ quy với các giá trị enum trong khi phương pháp thứ hai sử dụng một hàm constexpr.Metaprogramming với constexpr hoặc struct
kỳ vọng của chúng tôi là cả hai kết quả thực hiện trong thực thi có cùng kích thước. Tuy nhiên, việc thực hiện đầu tiên dẫn đến 9064 byte trong khi lần thứ hai có 9096 byte. Chúng tôi không nhớ sự khác biệt nhỏ trong byte nhưng không hiểu những gì gây ra sự khác biệt.
Chúng tôi biên soạn chương trình với GCC 4.8.2 mà không cờ tối ưu hóa, tuy nhiên, kết quả tương tự được tìm thấy lá cờ -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';
}
Chương trình này trông đơn giản đủ để Thao thiêt và phân tích. – Borsunho
'hàm constexpr' không được đảm bảo để được đánh giá tại thời gian biên dịch trừ khi được sử dụng trong ngữ cảnh yêu cầu một biểu thức không đổi. –