C++ biên dịch thời gian được một trận chiến cho mỗi dự án trên một kích thước nhất định. May mắn thay, với rất nhiều người viết các dự án C++ lớn, có nhiều giải pháp khác nhau:
Giải pháp giá rẻ cổ điển là "xây dựng sự thống nhất". Điều này chỉ có nghĩa là sử dụng #include
để đặt tất cả các tệp .cpp của bạn vào một tệp duy nhất để biên dịch. "Unity build" đã xuất hiện trong một số câu hỏi ở đây trên stackoverflow, here là câu hỏi nổi bật nhất mà tôi biết. Điều này screencast chứng tỏ làm thế nào để thiết lập một xây dựng như vậy trong Visual Studio.
Sự hiểu biết của tôi là xây dựng sự thống nhất nhanh hơn nhiều so với các bản dựng cổ điển vì bộ nhớ cache hiệu quả công việc được thực hiện bởi bộ tiền xử lý và trình liên kết. Một hạn chế đối với việc xây dựng sự thống nhất là nếu bạn chạm vào một tệp cpp, bạn sẽ phải biên dịch lại tệp cpp "lớn" của mình. Bạn có thể làm việc xung quanh điều này bằng cách phá vỡ tệp cpp mà bạn đang lặp đi lặp lại trong việc xây dựng sự thống nhất và biên dịch nó theo cách riêng của nó.
Ngoài Unity xây dựng, đây là một danh sách các thực hành tốt nhất của tôi:
- Sử dụng
#include
chỉ khi cần thiết, thích tờ khai phía trước
- Sử dụng pimpl thành ngữ để giữ thi lớp ra các tập tin tiêu đề thường được đưa vào. Làm như vậy cho phép bạn thêm thành viên vào một triển khai mà không phải chịu trách nhiệm biên dịch lại
- Sử dụng các tiêu đề được biên dịch trước (pch) cho các tệp tiêu đề được bao gồm thường hiếm khi thay đổi
- Đảm bảo rằng hệ thống xây dựng của bạn đang sử dụng tất cả các lõi có sẵn trên phần cứng địa phương
- Giữ danh sách các thư mục Preprocessor có để tìm kiếm tối thiểu, sử dụng đường dẫn chính xác trong
#include
báo cáo
- sử dụng
#pragma once
ở phía trên cùng của tập tin tiêu đề thay vì #ifndef __FOO_H #define __FOO_H ... #endif
, nếu bạn sử dụng các trick #ifndef
trình biên dịch sẽ có để mở tệp tiêu đề mỗi khi được bao gồm, #pragma once
al làm cho trình biên dịch trở nên hiệu quả hơn
Nếu bạn đang làm tất cả những gì (bản dựng kết hợp sẽ tạo sự khác biệt lớn nhất theo kinh nghiệm của tôi), tùy chọn cuối cùng được phân phối. distcc là giải pháp miễn phí tốt nhất mà tôi biết, incredibuild là tiêu chuẩn ngành độc quyền. Tôi cho rằng tính toán phân tán sẽ là cách duy nhất để có được thời gian lặp lại tuyệt vời trong quá trình biên dịch C++ lộn xộn. Nếu bạn có quyền truy cập vào một số lượng lớn máy móc hợp lý (nói, 10-20), điều này hoàn toàn đáng xem xét. Tôi nên đề cập đến sự hợp nhất xây dựng và phân phối xây dựng không phải là hoàn toàn cộng sinh bởi vì một biên dịch truyền thống có thể được chia thành các phần nhỏ hơn của công việc hơn là một sự thống nhất xây dựng. Nếu bạn muốn phân phối, nó có thể không đáng để thiết lập một bản dựng hợp nhất.
Nguồn
2012-12-07 20:58:01
Bạn đang nói bạn - xây dựng tất cả, thay đổi không có gì và xây dựng lại một lần nữa sẽ biên dịch lại nội dung? –
Xoreax Incredibuild, trong khi không rẻ, giúp ích rất nhiều. Chúng tôi thường xuyên nhận được tăng tốc> 10x.Điều đó nói rằng, phụ thuộc bị hỏng vẫn bị tổn thương rất nhiều bởi vì nó buộc một relink đắt tiền. – MSalters