2009-03-27 23 views
37

Các ứng cử viên tốt nhất cho một tệp tiêu đề được biên dịch trước là gì? Tôi có thể đặt tiêu đề STL và Boost ở đó, mặc dù chúng có mẫu không? Và điều đó có làm giảm thời gian biên dịch không? Ngoài ra, các cài đặt IDE tốt nhất để giảm thời gian biên dịch là gì?Điều gì cần đặt trong tiêu đề biên dịch trước? (MSVC)

+3

Tôi không muốn sử dụng PCH. Lý do là (1) Tôi thích tệp đầu tiên trong tệp cpp là tiêu đề tương ứng để bạn biết phần biên dịch đầu trang (2) kinh nghiệm của tôi là phụ thuộc checing với pch không hoàn toàn đáng tin cậy và kết quả là việc xây dựng gia tăng trở nên không đáng tin cậy trong các dự án rất lớn. Theo tôi, nó hiệu quả hơn về sự cân bằng không sử dụng pch và tận hưởng những lợi ích của việc xây dựng gia tăng đáng tin cậy. Điều này có thể không còn là trường hợp với các phiên bản Visual Studio mới nhất - kinh nghiệm của tôi với điều đó vẫn không đủ để phán xét. – Permaquid

Trả lời

47

Câu trả lời nhanh: tiêu đề STL và Boost thực sự thuộc về tệp tiêu đề được biên dịch trước, mặc dù các tệp tiêu đề này xác định các lớp mẫu.

Khi tạo tệp tiêu đề biên dịch sẵn, trình biên dịch phân tích văn bản tiêu đề (nhiệm vụ quan trọng!) Và chuyển đổi nó thành định dạng nhị phân được tối ưu hóa cho lợi ích của trình biên dịch.

Mặc dù các lớp mẫu sẽ được khởi tạo khi các tệp .cpp khác được biên dịch, chúng sẽ được khởi tạo từ thông tin trong tiêu đề biên dịch sẵn, trình biên dịch sẽ đọc nhanh hơn đáng kể.


(sau Ngoài)

Một điều mà bạn nên không bao gồm trong một tiêu đề precompiled là các tập tin là một phần của dự án của bạn và được thay đổi thường xuyên, ngay cả khi tất cả các tập tin cpp đơn bao gồm những tệp này.

Lý do là điều này - thế hệ của tiêu đề biên dịch trước có thể mất nhiều thời gian, vì thư viện tăng, stl và cửa sổ rất lớn.

Bạn có thể có một tệp đơn giản (ví dụ: "StringDefs.h") mà mọi thứ đều sử dụng. Nếu StringDefs.h được bao gồm trong stdafx.h và một nhà phát triển chạm vào StringDefs.h, thì mọi nhà phát triển phải đợi cho đến khi toàn bộ tiêu đề biên dịch đã được biên dịch trước toàn bộ tiêu đề. Sẽ nhanh hơn nếu StringDefs.h bị bỏ qua khỏi tiêu đề được biên dịch sẵn và được phân tích cú pháp cùng với mỗi tệp .CPP.

+0

Đó là một điểm công bằng - bao gồm các tệp thay đổi thường xuyên sẽ làm chậm thời gian xây dựng, tổng thể. – Andy

+4

Bạn chỉ có thể có 1 tệp tiêu đề được biên dịch trước trên mỗi tệp .cpp, nhưng bạn có thể có nhiều tiêu đề được biên dịch trước trong dự án của mình. –

+1

Bạn không chỉ phải đợi PCH biên dịch lại mà còn cho mọi tệp sử dụng nó. –

-1

Đặt bất kỳ thứ gì vào tiêu đề được biên dịch trước mà hầu hết các tệp .cpp trong dự án đó sẽ bao gồm mọi thứ. Điều này đi cho bất kỳ tập tin tiêu đề, thực sự. Điều này cho phép trình biên dịch phân tích cú pháp các tệp này một lần và sau đó sử dụng lại thông tin đó trong tất cả các tệp .cpp trong cùng một dự án.

+2

Tôi không đồng ý và đã viết thêm một phần trong câu trả lời của tôi để giải thích lý do. –

+0

tiêu đề biên dịch trước nên * không bao giờ * bao gồm tiêu đề dự án cục bộ – Tom

+0

Tôi đã làm việc rộng rãi trên một dự án theo lời khuyên sai lầm này và nó rất không hiệu quả - mỗi khi bạn biên dịch, mọi thứ biên dịch cho bất kỳ thay đổi nào. – Permaquid

6

Một bổ sung cho câu trả lời của Andrew Shepherd. Sử dụng tiêu đề được biên dịch trước cho các tệp tiêu đề nằm ngoài dự án của bạn, cho các tệp thay đổi thường xuyên. Nếu bạn đang thay đổi các tập tin tiêu đề trong dự án hiện tại tất cả các thời gian, nó có thể không có giá trị biên dịch trước chúng.

3

Tôi đã viết một bài viết về các kỹ thuật làm giảm thời gian biên dịch. Trong số các kỹ thuật này, một bài đăng trên tiêu đề biên dịch sẵn và ứng dụng của nó có thể được tìm thấy here. Nó cũng có một phần về thực hành tốt nhất mà bạn có thể thấy thú vị. Các script CMake xử lý nó một cách minh bạch được bao gồm.

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