2015-01-19 12 views
5

Tôi thường nghe nói rằng thực hành không tốt để đặt mã trong tiêu đề, nhưng việc đặt các hàm ngắn trong tiêu đề là một phần phổ biến, một phần giúp trình biên dịch tối ưu hóa tốt hơn.Trình biên dịch C/C++ hiện đại có tối ưu hóa tốt hơn với mã trong tiêu đề không?

Từ khóa nội tuyến có thể giúp trình biên dịch xác định chức năng nào cần được gạch chân, nhưng ngoài việc đó, vẫn còn một lý do để có các chức năng quan trọng về hiệu năng ngắn trong tiêu đề không? Hay nó không quan trọng nữa cho các trình biên dịch hiện đại?

+1

Khi bạn bao gồm tệp tiêu đề, trình xử lý trước sẽ sao chép và dán mã ở nơi bạn đã bao gồm. – Andrew

+0

Tôi đề nghị bạn hãy xem qua đây: http://programmers.stackexchange.com/questions/180904/are-header-files-actually-good –

+1

'inline' chủ yếu không có nghĩa là" làm cho mã này nội dòng "trong C++ , nó có nhiều hơn để làm với cách giải quyết va chạm tên thời gian liên kết. "Đưa mã nội tuyến" có rất ít ý nghĩa trong bối cảnh của tiêu chuẩn C++. – Yakk

Trả lời

4

Về mặt kỹ thuật, từ khóa inline chỉ có nghĩa là định nghĩa được phép trong nhiều đơn vị dịch. Tức là, nếu bạn có một hàm nội tuyến được định nghĩa trong một tệp tiêu đề và tiêu đề đó được bao gồm trong nhiều tệp nguồn thì điều đó là tốt. Đối với một chức năng không phải là nội tuyến, không phải mẫu, điều đó sẽ là bất hợp pháp.

Nhưng trình biên dịch có thể và tận dụng lợi thế của việc có thể xem mã của hàm đang được gọi. Điều này xảy ra không chỉ cho các hàm nội tuyến mà còn bất kỳ hàm nào khác có mã có thể được hiển thị. Nhiều trình biên dịch cố gắng thực hiện một dự đoán tốt về việc có nên đặt mã nội tuyến hay không. Có mã được inlined có thể làm cho chương trình lớn hơn hoặc nhỏ hơn, nhanh hơn hoặc chậm hơn. Nếu trình biên dịch có thể xác định rằng mã có thể sẽ nhanh hơn và nhỏ hơn khi mã được gạch chân, thì nó sẽ làm điều đó. Nếu không, nó phải xem xét sự cân bằng.

Nhiều trình biên dịch hiện đại có thể tối ưu hóa thời gian liên kết, trong đó mã không được bắt đầu có thể được gạch chân trong giai đoạn liên kết, với một số chi phí trong thời gian liên kết. Có thể có một số cơ hội tối ưu hóa bị mất khi bị trì hoãn cho đến thời gian liên kết.

Theo kinh nghiệm của riêng tôi, tôi thấy rằng việc tạo các chức năng nhỏ là nội tuyến thường là một chiến thắng cho cả kích thước và tốc độ. Đối với các chức năng lớn hơn, tôi thường thấy nó làm cho các chương trình nhanh hơn nhưng lớn hơn, nhưng tôi cũng thấy nó hiếm khi làm cho các chương trình chậm hơn và lớn hơn. Nếu hiệu suất của một chức năng cụ thể là quan trọng, bạn sẽ cần phải thực hiện các phép đo để giúp lựa chọn có nên nội tuyến hay không.

+0

Thông tin tốt. Phần quan trọng ở đây với tôi là "trình biên dịch có thể và tận dụng lợi thế của việc có thể xem mã của hàm đang được gọi" và điều này cũng đúng với tối ưu hóa liên kết thời gian/toàn bộ chương trình.Tôi đã hy vọng để đối phó với điều này chỉ với khả năng đọc trong tâm trí, nhưng những gì bạn nói có ý nghĩa, và như thường lệ có vẻ như không có thay thế cho điểm chuẩn thực tế. Cảm ơn nhiều! –

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