Đây thực sự không phải là câu trả lời cho câu hỏi của bạn. Đó là một quan sát phụ.
Tôi cũng không phải là luật sư ngôn ngữ C++, vì vậy tôi có thể thoát khỏi cơ sở bằng một số chi tiết.
Nhưng, ý tưởng thô phải chính xác.
Lý do chính mà trình biên dịch C++ mất một thời gian dài để biên dịch mẫu meta-chương trình là do cách các siêu mẫu được chỉ định.
Chúng không được chỉ định trực tiếp dưới dạng mã mà bạn muốn trình biên dịch chạy lúc biên dịch. Lấy ví dụ về tính toán độ dài của một danh sách loại.
Nếu bạn có thể viết mã như thế này:
compile_time size_t GetLength(TypeList * pTypeList)
{
return DoGetLength(pTypeList, 0);
}
compile_time size_t DoGetLength(TypeList * pTypeList, size_t currentLength)
{
if (pTypeList)
{
return DoGetLength(pTypeList->Next, ++currentLength);
}
else
{
return currentLength;
}
}
Đó là một số cách biên dịch riêng rẽ từ mã nơi nó được sử dụng, và được tiếp xúc với ngôn ngữ thông qua một số cú pháp, sau đó trình biên dịch sẽ có thể thực hiện nó rất nhanh.
Nó sẽ chỉ là một cuộc gọi hàm đệ quy đơn giản.
Có thể thiết kế ngôn ngữ cho phép những thứ đó. Hầu hết những người làm điều này (như lisp) được gõ động, nhưng nó có thể làm với gõ tĩnh. Tuy nhiên, nó không bao giờ có thể là một cái gì đó bạn sẽ thấy thực hiện trong C + +.
Các vấn đề trong C++, tuy nhiên, được rằng mã được viết như sau:
template <typename First, typename Second>
struct TypeList
{
typedef First Head;
typedef Second Tail;
};
template <>
struct ListSize<NullType>
{
enum { size = 0 };
};
template <typename Head, typename Tail>
struct ListSize<TypeList<Head, Tail> >
{
enum { size = 1 + ListSize<Tail>::size };
};
Để cho trình biên dịch để "thực thi" meta-chương trình nó phải:
- Thi công biểu đồ phụ thuộc cho các giá trị ban đầu của giá trị enum "kích thước"
- Tạo kiểu mẫu cho mỗi cạnh trong biểu đồ
- Liên kết tất cả ký hiệu được tham chiếu bởi mỗi mẫu loại
- topology với sắp xếp các đồ thị phụ thuộc
- Traverse đồ thị và đánh giá hằng
Đây là đắt hơn nhiều hơn là chỉ đơn giản là chạy một O (N) thuật toán đệ quy.
Trường hợp xấu nhất sẽ giống như O (N * M * L), với N bằng độ dài của danh sách, M là mức phạm vi lồng nhau, và L là số biểu tượng trong mỗi phạm vi.
Lời khuyên của tôi là giảm thiểu số lượng lập trình meta mẫu C++ mà bạn sử dụng.
Tôi muốn các nhà phát triển trình biên dịch tập trung vào tối ưu hóa mã được tạo và tận dụng lợi thế của tính song song (SMP, distcc, Xoreax IncrediBuild, v.v.) để tăng tốc các bản dựng. – bk1e
Tại sao không yêu cầu họ làm việc trên cả hai vấn đề? Lợi ích tôi mong đợi từ một trình biên dịch C++ đã được tối ưu hóa cho các mẫu cao hơn nhiều so với cái tôi nhận được từ việc sử dụng song song (và tôi đã làm), trừ khi bạn được bao quanh bởi một máy tính đang chờ bạn biên dịch mã (i don ' t)! –