2008-11-05 40 views
10

Tôi thường chạy vào các lớp lớn, không phải mẫu trong C++, nơi các phương thức đơn giản được xác định trực tiếp trong phần thân của lớp trong tệp tiêu đề thay vì riêng trong tệp triển khai. Ví dụ:Tại sao các phương thức C++ đôi khi được định nghĩa bên trong các lớp?

class Foo { 
    int getBar() const { return bar; } 
    ... 
}; 

Tại sao phải làm như vậy? Có vẻ như có những bất lợi. Việc thực hiện không phải là ẩn như nó phải được, mã là ít có thể đọc được, và cũng sẽ có một gánh nặng gia tăng trên trình biên dịch nếu tập tin tiêu đề của lớp được bao gồm trong nhiều nơi khác nhau.

Đoán của tôi là mọi người có ý định cho các chức năng này được gạch chân trong các mô-đun khác, điều này có thể cải thiện hiệu suất đáng kể. Tuy nhiên, tôi đã nghe các trình biên dịch mới hơn có thể làm nội tuyến (và các tối ưu hóa xen kẽ khác) tại thời gian liên kết trên các mô-đun. Mức độ hỗ trợ cho loại tối ưu hóa liên kết thời gian này là bao nhiêu và nó có thực sự làm cho các định nghĩa này không cần thiết không? Có bất kỳ lý do chính đáng nào khác cho các định nghĩa này không?

Trả lời

14

Chuẩn C++ nói rằng các phương thức được xác định bên trong định nghĩa lớp là inline theo mặc định. Điều này dẫn đến lợi ích hiệu suất rõ ràng cho các chức năng đơn giản như getters và setters. Tối ưu hóa mô-đun chéo liên kết thời gian là khó hơn, mặc dù một số trình biên dịch có thể làm điều đó.

+1

Có, nhưng "nội tuyến theo mặc định" không có nghĩa là trình biên dịch sẽ nội tuyến chúng, chỉ rằng bạn không tự phải thêm gợi ý * mà từ khóa "nội tuyến" thực sự là. –

2

Bạn đã trả lời câu hỏi của riêng mình, chúng thực sự là phương thức nội tuyến.

Lý do sử dụng chúng là hiệu suất.

+0

Tuy nhiên, điều này không có nghĩa là trình biên dịch sẽ nội tuyến chúng, chỉ rằng bạn không tự phải thêm gợi ý * mà từ khóa "nội tuyến" thực sự là. –

7

Thường thì không có lý do gì ngoài việc dễ dàng hơn và tiết kiệm thời gian. Nó cũng tiết kiệm một chút lộn xộn trong tập tin thực hiện, trong khi chiếm cùng một số dòng trong tập tin tiêu đề. Và ít có thể đọc được khá căng nếu nó bị giới hạn bởi những thứ như getters và setters.

+0

Không cần phải tập tin nguồn lộn xộn với mã tầm thường. –

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