Tất cả các trình biên dịch C ++ có một vấn đề nghiêm trọng về hiệu năng để giải quyết. Biên dịch mã C ++ là một quá trình dài, chậm.
Biên dịch các tiêu đề được bao gồm trên đầu các tệp C ++ là một quá trình rất dài, chậm. Biên dịch các cấu trúc tiêu đề khổng lồ tạo thành một phần của API Windows và các thư viện API lớn khác là một quá trình rất , rất dài, chậm. Phải làm lại, hơn và hơn, cho mỗi tệp nguồn Cpp duy nhất là một hồi chuông báo tử.
Đây không phải là duy nhất cho Windows nhưng là một vấn đề cũ mà tất cả các trình biên dịch phải đối mặt với một API lớn như Windows.
Trình biên dịch Microsoft có thể cải thiện vấn đề này bằng một thủ thuật đơn giản gọi là tiêu đề được biên dịch trước . Thủ thuật này khá lắt léo: mặc dù mọi tệp CPP có thể mang lại ý nghĩa khác nhau về mặt pháp lý cho chuỗi tệp tiêu đề được bao gồm trên đầu mỗi tệp Cpp (bởi những thứ như có các macro khác nhau # xác định trước bao gồm, hoặc bằng cách bao gồm các tiêu đề theo thứ tự khác nhau), đó thường không phải là trường hợp. Hầu hết thời gian, chúng tôi có hàng chục hoặc hàng trăm tệp được bao gồm, nhưng tất cả chúng đều có cùng ý nghĩa đối với tất cả các tệp Cpp đang được biên dịch trong ứng dụng của bạn.
Trình biên dịch có thể tiết kiệm thời gian rất lớn nếu nó không phải bắt đầu biên dịch mọi tệp Cpp cộng với hàng tá bao gồm cả nghĩa đen từ đầu mỗi lần.
Thủ thuật bao gồm chỉ định một tệp tiêu đề đặc biệt làm điểm bắt đầu của tất cả các chuỗi biên dịch, tệp được gọi là 'tiêu đề được biên dịch trước', thường là một tệp có tên stdafx.h đơn giản vì lý do lịch sử.
Chỉ cần liệt kê tất cả các tiêu đề lớn của bạn cho các API trong tệp stdafx.h của bạn, theo thứ tự phù hợp và sau đó bắt đầu mỗi tệp CPP của bạn ở trên cùng với một #include "stdafx.h"
, trước bất kỳ nội dung có ý nghĩa nào (chỉ về điều duy nhất được phép trước đó là bình luận).
Trong các điều kiện đó, thay vì bắt đầu từ đầu , trình biên dịch bắt đầu biên dịch từ các kết quả đã lưu của việc biên dịch mọi thứ trong đó stdafx.h
.
Tôi không tin rằng thủ thuật này là duy nhất đối với các trình biên dịch của Microsoft và tôi cũng không nghĩ rằng đó là một sự phát triển ban đầu.
Đối với trình biên dịch Microsoft, cài đặt kiểm soát việc sử dụng các tiêu đề được biên dịch trước được điều khiển bởi một đối số dòng lệnh cho trình biên dịch : /Yu "stdafx.h"
. Như bạn có thể tưởng tượng, việc sử dụng stdafx.h
tên tệp chỉ đơn giản là một quy ước; bạn có thể thay đổi tên nếu bạn muốn
Trong Visual Studio 2010, cài đặt này được điều khiển từ GUI thông qua Nhấp chuột phải vào Dự án CPP, chọn 'Thuộc tính' và điều hướng đến "Thuộc tính cấu hình \ C / C ++ \ Tiêu đề được biên dịch trước". Đối với các phiên bản khác của Visual Studio, vị trí trong GUI sẽ khác nhau.
Lưu ý rằng nếu bạn vô hiệu hóa các tiêu đề được biên dịch trước (hoặc chạy dự án của bạn thông qua một công cụ không hỗ trợ chúng), thì nó không làm cho chương trình của bạn trở thành bất hợp pháp; nó đơn giản có nghĩa là công cụ của bạn sẽ biên dịch mọi thứ từ đầu mỗi lần.
Nếu bạn đang tạo một thư viện không có phụ thuộc Windows, bạn có thể dễ dàng nhận xét hoặc xóa #include
s khỏi stdafx.h
tệp. Không cần phải xóa tệp mỗi lần, nhưng rõ ràng bạn cũng có thể làm như vậy, bằng cách vô hiệu hóa cài đặt tiêu đề tiền biên dịch ở trên.