2011-06-22 29 views
5

Loại ma thuật ác nào mà nó đang cố gắng làm!?!Tại sao các khái niệm làm cho C++ biên dịch chậm hơn?

Tôi đã nghe một số Q&A session with herb sutter và một câu hỏi về khái niệm. Herb đề cập đến nó làm cho trình biên dịch chậm hơn (trong khi nguồn vẫn không thay đổi) và phần lớn hơn đáng kể sau đó phần trên mẫu.

Tại sao lại thực hiện việc này? tôi có thể tìm tài liệu về khái niệm ở đâu?

Trả lời

9

Trước hết, Herb không nói rằng bản thân các khái niệm đã biên dịch chậm hơn. Ông nói rằng khái niệm hóa thư viện chuẩn C++ đã thực hiện bất kỳ mã nào bằng cách sử dụng thư viện chuẩn C++ biên dịch chậm hơn.

Lý do dẫn đến một số điều.

1: Các mẫu sắp xếp phải mất thời gian biên dịch.

Khi bạn khai báo một lớp học như thế này:

template<typename T> class Foo {...}; 

Trình biên dịch chỉ đơn giản là phân tích Foo và làm rất ít. Ngay cả với hai giai đoạn tra cứu, trình biên dịch chỉ đơn giản là không làm một toàn bộ rất nhiều trong việc biên soạn của lớp Foo. Nó lưu trữ nó cho sau này, tất nhiên, nhưng vượt qua ban đầu là tương đối nhanh.

Khi bạn làm hạn chế các mẫu với một khái niệm:

template<ConceptName C> class Foo {...}; 

Trình biên dịch phải làm một số việc. Nó phải kiểm tra trước rằng mọi việc sử dụng loại C đều tuân theo khái niệm ConceptName. Đó là thêm công việc mà trình biên dịch sẽ có được hoãn lại cho đến khi thời gian instantiation.

Bạn càng có nhiều kiểm tra khái niệm, thời gian bạn phải chi tiêu để xác minh rằng các loại khớp với các khái niệm.

2: Thư viện C++ chuẩn sử dụng rất nhiều khái niệm.

Nhìn vào số lượng khái niệm của trình lặp: đầu vào, đầu ra, chuyển tiếp, hai chiều, tuần tự, tiếp giáp. Và ủy ban đang xem xét chia nhỏ chúng thành nhiều hơn thế. Nhiều thuật toán sẽ có nhiều phiên bản cho các khái niệm lặp khác nhau.

Và điều này không bao gồm các khái niệm phạm vi (trong đó có một khái niệm cho mọi loại khái niệm lặp ngoại trừ đầu ra), khái niệm ký tự cho chuỗi std :: và nhiều loại thứ khác. Tất cả những điều này phải được biên soạn và kiểm tra.


Khái niệm thực sự cần thiết để thực hiện nhanh là mô-đun. Khả năng cho trình biên dịch tạo ra một tệp mô-đun có chứa một chuỗi ký tự được kiểm tra trước và sau đó tải tệp đó trực tiếp mà không cần phải trải qua quá trình biên dịch chuẩn. Trực tiếp từ phân tích cú pháp đến tạo biểu tượng.

Hãy nhớ: đối với mỗi tệp .cpp bạn #include, trình biên dịch phải đọc tệp đó và biên dịch nó. Mặc dù tập tin là cùng một điều mỗi khi nó thực hiện điều này, nó vẫn phải dutifully đọc các tập tin và xử lý nó. Nếu chúng ta đang nói về một khái niệm-ized std::vector, nó phải làm tất cả các khái niệm kiểm tra của mẫu. Nó vẫn phải thực hiện tất cả tra cứu ký hiệu chuẩn mà bạn thực hiện khi biên dịch. Và kể từ đó trở đi.

Hãy tưởng tượng nếu trình biên dịch không phải thực hiện việc này. Hãy tưởng tượng nếu nó chỉ có thể tải một loạt các biểu tượng và định nghĩa trực tiếp từ đĩa. Không biên dịch chút nào; chỉ cần đưa vào các biểu tượng và định nghĩa cho các mã khác để sử dụng.

Nó sẽ giống như các tiêu đề được biên dịch trước chỉ tốt hơn. Các tiêu đề được biên dịch trước bị hạn chế chỉ có một tệp cho mỗi tệp .cpp, trong khi bạn có thể sử dụng nhiều mô-đun tùy thích.

Đáng buồn thay, các mô-đun được kéo dài khá sớm trong quá trình từ C++ 0x. Và không có mô-đun, việc hạn chế thư viện chuẩn với các khái niệm sẽ luôn biên dịch chậm hơn so với phiên bản không bị giới hạn.

Lưu ý rằng Herb hiểu sai mục đích của các mô-đun (không khó, vì hầu hết các khái niệm ban đầu của tính năng là những điều ông đã nói về: cross-platform DLLs và như vậy). Mục đích cơ bản cốt lõi của họ là giúp biên dịch thời gian, không làm cho các DLL đa nền tảng hoạt động. Cũng không phải là nó dự định rằng các mô-đun chính họ là nền tảng chéo.

+0

+! để giải thích về sự chậm chạp gây ra bởi các khái niệm, nhưng bạn có một tham chiếu cho tầm nhìn của các khái niệm mà bạn trình bày (trái với cái mà Herb Sutter có) không? –

+0

@Ben Voigt: Đó là các mô-đun chứ không phải khái niệm. Và đó không phải là tầm nhìn của tôi; đó là mục tiêu thiết kế của các mô-đun mô-đun gần đây nhất được vạch ra bởi Daveed Vandevoorde trong N2316. Nó có sẵn dưới dạng PDF tại đây: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/ –

+0

Vâng, ý tôi là các mô-đun. Một tham chiếu nhóm làm việc là chính xác những gì tôi đã hy vọng. –

0

Bạn có thể tìm thấy tài nguyên hữu ích trên ConceptsGCC website. Đó là trình biên dịch (được tách ra khỏi GCC) mà họ đang xây dựng để xem liệu khái niệm này có khả thi hay không.

Tôi tưởng tượng chi phí đến từ việc phải thực hiện kiểm tra hiệu lực toàn diện và phổ biến và đệ quy trên tất cả các loại cấu trúc ngôn ngữ, và cho rằng bạn có thể chỉ định một bộ ràng buộc khá phong phú, kiểm tra xem chúng có tốn kém không.

Một chút giống như phiên bản ác mộng về các đặc điểm ngoại lệ!

Các vấn đề liên quan