2009-04-15 26 views
6

Như tôi đã hiểu, tất cả các hàm thành viên đều là ảo trong D nhưng trình biên dịch được tự do thực hiện các chức năng không ảo nếu thấy rằng chúng không bao giờ bị ghi đè.Có cách nào để đảm bảo rằng các chức năng thành viên là ảo trong D?

Điều tôi không rõ ràng là điều gì sẽ xảy ra khi bạn biên dịch một mô-đun trong đó chức năng thành viên không bị ghi đè và sau đó nhập mô-đun đó vào nơi khác mà bạn ghi đè hàm thành viên. Tôi không nghĩ rằng nó sẽ biên dịch lại mô-đun ban đầu. Nó chỉ đơn giản giả định rằng bất kỳ chức năng thành viên với liên kết bên ngoài là ảo?

Trả lời

5

Tất cả các hàm thành viên D là ảo theo mặc định. Tôi không nghĩ rằng có bất kỳ trình biên dịch ra khỏi đó mà thực sự làm cho chức năng không ảo như một tối ưu hóa. Tuy nhiên, bạn có thể thực hiện thủ công bằng cách đánh dấu lớp hoặc chức năng là "cuối cùng".

1

Tôi tin rằng FeepingCreature là chính xác, nhưng ngoài ra tôi nghĩ bạn có thể giả định rằng tối ưu hóa như vậy sẽ chỉ được xem xét bởi trình biên dịch nếu nó trực tiếp tạo ra một tập tin thực thi từ các nguồn.

2

FeepingCreature chủ yếu là chính xác ngoại trừ các chức năng được tạo khuôn mẫu không thể thực hiện ảo.

2

Cách thực hiện này là trình biên dịch và liên kết cụ thể. Nhưng một trong những tình huống phổ biến mà các cuộc gọi hàm ảo có thể được tối ưu hóa đi, là khi bạn có một lớp được khởi tạo cục bộ. Sau đó, các cuộc gọi chức năng có thể được thực hiện trực tiếp trong phạm vi này, bởi vì loại của lớp được biết đầy đủ tại thời gian biên dịch. Điều này có thể được thực hiện ở mức trình biên dịch. Bên cạnh đó, nếu trình liên kết nhận ra thực hiện chức năng không bao giờ bị ghi đè, thì trình liên kết có thể thực hiện tối ưu hóa và thay thế các cuộc gọi hàm ảo bằng các cuộc gọi hàm trực tiếp trên lớp đó. Đặc biệt, nếu một lớp không bao giờ được dẫn xuất, thì tất cả các cuộc gọi đến các hàm thành viên có thể được thực hiện trực tiếp. Nó giống như là mối liên kết sẽ chèn từ khóa 'cuối cùng' vào bất cứ nơi nào có thể. (Trình liên kết có thể không áp dụng tối ưu hóa này cho các lớp và chức năng được xuất khẩu, vì trình liên kết không biết các chức năng có được ghi đè trong các thư viện hoặc tệp thực thi khác hay không.)

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