Đầu trang được biên dịch trước (PCH) là các tệp đặc biệt mà một số trình biên dịch nhất định có thể tạo cho tệp .cpp. Chúng chính xác là gì: mã nguồn được biên dịch trước. Chúng là mã nguồn đã được cung cấp thông qua trình biên dịch và được xây dựng thành một định dạng phụ thuộc trình biên dịch.
PCH thường được sử dụng để tăng tốc biên dịch. Bạn đặt các tiêu đề thường được sử dụng trong PCH, sau đó chỉ bao gồm PCH. Khi bạn thực hiện #include
trên PCH, trình biên dịch của bạn không thực sự thực hiện công việC#include thông thường. Thay vào đó, nó tải các biểu tượng được biên dịch trực tiếp này vào trình biên dịch. Không chạy bộ tiền xử lý C++. Không chạy trình biên dịch C++. Không # bao gồm một triệu tệp khác nhau. Một tệp được tải và các biểu tượng xuất hiện hoàn toàn trực tiếp trong không gian làm việc của trình biên dịch của bạn.
Tôi đề cập đến tất cả những điều đó bởi vì các mô-đun là PCH trong mẫu hoàn hảo hoàn hảo của chúng. PCH về cơ bản là một hack khổng lồ được xây dựng trên một hệ thống không cho phép các mô-đun thực tế. Mục đích của mô-đun là cuối cùng để có thể lấy một tập tin, tạo ra một tập tin mô-đun trình biên dịch cụ thể có chứa các biểu tượng, và sau đó một số tập tin khác tải mô-đun đó khi cần thiết. Các biểu tượng được biên dịch trước, do đó, một lần nữa, không cần phải # bao gồm một loạt các công cụ, chạy một trình biên dịch, vv Mã của bạn nói, import thing.foo
, và nó xuất hiện.
Nhìn vào bất kỳ tiêu đề thư viện chuẩn có nguồn gốc STL nào. Lấy ví dụ <map>
. Tỷ lệ cược là tốt mà tập tin này hoặc là khổng lồ hoặc có rất nhiều #inclusions của các tập tin khác mà làm cho tập tin kết quả khổng lồ. Đó là rất nhiều phân tích cú pháp C++ phải xảy ra. Nó phải xảy ra cho mỗi tệp .cpp có #include <map>
trong đó. Mỗi khi bạn biên dịch một tệp nguồn, trình biên dịch phải biên dịch lại cùng một thứ. Kết thúc. Và kết thúc. Và hơn nữa.
Không <map>
thay đổi giữa các bộ sưu tập? Không, nhưng trình biên dịch của bạn không thể biết điều đó. Vì vậy, nó phải tiếp tục biên dịch lại nó.Mỗi khi bạn chạm vào tệp .cpp, tệp phải biên dịch mọi tiêu đề mà tệp .cpp này bao gồm. Mặc dù bạn không chạm vào các tiêu đề hoặc tệp nguồn ảnh hưởng đến các tiêu đề đó.
Tệp PCH là một cách để giải quyết vấn đề này. Nhưng chúng bị hạn chế, bởi vì chúng chỉ là một hack. Bạn chỉ có thể bao gồm một tệp cho mỗi tệp .cpp, vì nó phải là tệp đầu tiên được bao gồm bởi tệp .cpp. Và vì chỉ có một PCH, nếu bạn làm điều gì đó thay đổi PCH (như thêm tiêu đề mới vào nó), bạn phải biên dịch lại mọi thứ trong PCH đó.
Mô-đun cơ bản không liên quan gì đến trình biên dịch chéo ABI (mặc dù có một trong số đó là tốt đẹp và các mô-đun sẽ giúp dễ xác định một mô-đun hơn). Mục đích cơ bản của họ là tăng tốc thời gian biên dịch.
Mục đích cơ bản vượt ra ngoài chỉ tăng tốc thời gian biên dịch .....: D –