Instantiating một mẫu là tốn kém tại thời gian biên dịch nhưng virtualy miễn phí trong thời gian chạy . Về cơ bản, mỗi khi bạn sử dụng một kiểu mẫu mới, trình biên dịch phải tạo mã cho loại mới đó, đó là lý do tại sao mã nằm trong một tiêu đề, để trình biên dịch có quyền truy cập vào mã sau này.
Đặt tất cả mã của bạn vào tệp .cpp cho phép trình biên dịch biên dịch mã đó chỉ một lần để tăng tốc độ biên dịch. Bạn có thể trong lý thuyết viết tất cả các mã của bạn trong tiêu đề, nó sẽ làm việc tốt, nhưng nó sẽ mất mãi mãi để biên dịch các dự án rất lớn. Ngoài ra, ngay sau khi bạn sẽ thay đổi một dòng bất cứ nơi nào, bạn sẽ phải xây dựng lại tất cả mọi thứ.
Bây giờ bạn có thể hỏi, làm cách nào mà STL và BOOST không quá chậm? Đó là nơi các tiêu đề được biên dịch sẵn đến để giải cứu. PCHs cho phép trình biên dịch thực hiện công việc tốn kém nhất chỉ một lần. Điều này làm việc tốt với mã mà sẽ không thay đổi thường xuyên như các thư viện, nhưng hiệu quả của nó là hoàn toàn vô hiệu hóa cho mã mà thay đổi rất nhiều khi bạn sẽ phải biên dịch lại toàn bộ các tiêu đề biên dịch sẵn mọi lúc. Trình biên dịch cũng sử dụng một vài thủ thuật để tránh biên dịch lại tất cả các mã mẫu trong mọi đơn vị biên dịch.
Cũng lưu ý rằng C++ 0x sẽ giới thiệu cơ chế rõ ràng để kiểm soát tốt hơn việc tạo mẫu. Bạn sẽ có thể tạo ra một cách rõ ràng các mẫu và, quan trọng nhất là ngăn chặn sự instanciation trong một số đơn vị biên dịch. Tuy nhiên, hầu hết công việc đó đã được thực hiện bởi hầu hết các trình biên dịch mà chúng ta không biết.
Vì vậy, quy tắc chung là, đặt nhiều mã (và bao gồm chỉ thị) nhất có thể trong tệp .cpp của bạn. Nếu bạn không thể, tốt, bạn không thể.
Lời khuyên của tôi sẽ là: không chỉ mẫu cho heck của nó. Nếu bạn phải mẫu, hãy cẩn thận và nhận thức được rằng bạn đang trong thực tế lựa chọn giữa tốc độ biên dịch và khả năng sử dụng các mẫu sẽ mang lại.
Thật lố bịch khi câu hỏi này đã bị đóng. Nó rõ ràng và rõ ràng với tôi những gì đang được hỏi. Và tôi nghĩ rằng một câu trả lời cho câu hỏi này sẽ rất hữu ích để có trên trang web này. – Omnifarious
@Omni: Tôi đã bỏ phiếu để đóng câu hỏi này bởi vì (IMHO) đó là sự kết hợp của một cuộc chiến tranh lửa đang chờ xảy ra, và unanswerables mở ("tôi không nên dựa nhiều vào các mẫu?"). –
@Oil Charlseworth - Ahh, vâng, tôi có thể thấy rằng ngôn ngữ được sử dụng sẽ là một chút viêm. Tôi sẽ chỉnh sửa nó thành một câu hỏi trung lập hơn. – Omnifarious