2011-02-04 32 views
18

Tôi đang xem xét sử dụng thừa kế ảo trong ứng dụng thời gian thực. Việc sử dụng thừa kế ảo có tác động hiệu năng tương tự như việc gọi một hàm ảo không? Các đối tượng trong câu hỏi sẽ chỉ được tạo lúc khởi động nhưng tôi lo ngại nếu tất cả các hàm từ hệ thống phân cấp sẽ được gửi đi thông qua vtable hoặc nếu chỉ các đối tượng từ lớp cơ sở ảo sẽ là.Tác động hiệu suất của thừa kế ảo

+1

Trừ khi bạn đang sử dụng đa kế thừa, không có thực sự là một nhu cầu sử dụng thừa kế ảo. –

+0

@ZacHowland, trừ khi bạn đang sử dụng chế nhạo bằng Google Test. (gtest) –

+3

@Điều kiện: Không có "trừ khi". Khi sử dụng Google Test, bạn vẫn chỉ sử dụng thừa kế ảo khi giao dịch với nhiều thừa kế. –

Trả lời

22

Các triển khai phổ biến sẽ truy cập vào thành viên dữ liệu các lớp cơ sở ảo sử dụng thêm một hướng dẫn.

Như James chỉ ra trong nhận xét của mình, gọi hàm thành viên của lớp cơ sở trong kịch bản đa thừa kế sẽ cần điều chỉnh con trỏ this và nếu lớp cơ sở đó là ảo, thì bù trừ của lớp cơ sở phụ đối tượng trong đối tượng của lớp dẫn xuất phụ thuộc vào kiểu động của lớp dẫn xuất và sẽ cần phải được tính toán khi chạy.

Cho dù điều này có bất kỳ tác động hiệu quả có thể nhìn thấy trên các ứng dụng thực tế phụ thuộc vào nhiều yếu tố:

  • làm căn cứ ảo có dữ liệu thành viên ở tất cả? Thông thường, đó là các lớp cơ sở trừu tượng cần được bắt nguồn từ hầu như, và các cơ sở trừu tượng có bất kỳ thành phần dữ liệu nào thường là một mùi mã.

  • Giả sử bạn có cơ sở ảo với thành viên dữ liệu, những người này có được truy cập trong đường dẫn quan trọng? Nếu người dùng nhấp vào một số nút trong giao diện đồ họa, bạn sẽ nhận được thêm vài chục người khác, không ai nhận thấy.

  • Điều gì sẽ là thay thế nếu căn cứ ảo được tránh? Không chỉ thiết kế có thể kém hơn, nó cũng có khả năng là thiết kế thay thế cũng có tác động hiệu suất. Nó phải đạt được cùng một mục tiêu, sau khi tất cả, và TANSTAAFL. Sau đó, bạn giao dịch một mất hiệu suất cho một cộng với một thiết kế kém hơn.


lưu ý bổ sung: Có một cái nhìn tại Stan Lippmann của Inside the C++ Object Model, mà trả lời câu hỏi như vậy khá triệt để.

+0

Để làm rõ, chỉ các cuộc gọi đến các lớp cơ sở ảo của các thành viên/chức năng mới dẫn đến thêm một số hướng dẫn? – Graeme

+0

@Graeme: Tôi chắc chắn không có chuyên gia trong lĩnh vực này, nhưng tôi không thấy các cuộc gọi đến thành viên lớp cơ sở ảo _functions_ sẽ dẫn đến mất hiệu suất như thế nào. Chúng được gửi đi tĩnh ('B :: f()') hoặc tự động thông qua bảng ảo của lớp dẫn xuất, giống như các hàm thành viên của các cơ sở không ảo. ICBWT. – sbi

+1

@sbi: Nếu hàm không phải là ảo, thì hàm được gọi có thể được chọn tĩnh, nhưng con trỏ 'this' này phải được tính [hoặc tra cứu] khi chạy, phải không? –

0

Bạn có chắc chắn là bạn có nghĩa là thừa kế ảo không? Nếu vậy, nó giống với chi phí của một cuộc gọi chức năng ảo bình thường. Tìm kiếm chuỗi vtable chỉ theo một con đường cụ thể.

Bạn nói rằng điều này đã bắt đầu. Chi phí đĩa của bạn (chỉ đơn giản là tải mã của bạn vào bộ nhớ) có khả năng yêu cầu các đơn đặt hàng có cường độ lớn hơn thời gian hơn nửa tá hướng dẫn hoặc vì vậy cho các tra cứu vtable. Tôi sẽ hơi ngạc nhiên nếu bạn có thể lập hồ sơ này và phát hiện sự khác biệt.

3

Hãy xem nghiên cứu thử nghiệm quy mô lớn sau đây được xuất bản OOPSLA'96. Tôi đang sao chép dán một mục nhập bibtex, tóm tắt và một liên kết đến bài báo. Tôi sẽ xem đây là nghiên cứu thực nghiệm toàn diện nhất về chủ đề này cho đến nay.

@article{driesen1996direct, 
    title={{The direct cost of virtual function calls in C++}}, 
    author={Driesen, K. and H{\\"o}lzle, U.}, 
    journal={ACM Sigplan Notices}, 
    volume={31}, 
    number={10}, 
    pages={306--323}, 
    issn={0362-1340}, 
    year={1996}, 
    publisher={ACM} 
} 

Tóm tắt: Chúng tôi nghiên cứu các chi phí trực tiếp của chức năng ảo cuộc gọi trong chương trình C++, giả định các tiêu chuẩn thực hiện sử dụng các bảng chức năng ảo. Chúng tôi đo lường chi phí này trên thực nghiệm cho một số chương trình điểm chuẩn lớn , sử dụng kết hợp kiểm tra thực thi và mô phỏng bộ vi xử lý. Kết quả của chúng tôi cho thấy rằng các chương trình C++ được đo chi tiêu một trung bình là 5,2% thời gian của chúng và 3,7% trong số hướng dẫn trong mã công văn của chúng. Đối với các phiên bản “tất cả các ảo” của chương trình, chi phí trung bình tăng lên 13,7% (13% của hướng dẫn). Biến thể “thunk” của việc triển khai bảng chức năng ảo làm giảm chi phí trung bình 21% so với việc thực hiện tiêu chuẩn . Trên bộ vi xử lý trong tương lai, những các chi phí có thể sẽ tăng vừa phải

http://www.cs.ucsb.edu/~urs/oocsb/papers/oopsla96.pdf

+1

+1 để tham khảo tốt đẹp. –

+4

Tôi sẽ không ngạc nhiên nếu tối ưu hóa trình biên dịch đã khiến nghiên cứu này lỗi thời. Nó được xuất bản vào năm 1996. –

+6

Um. Nhưng câu hỏi là về ___virtual inheritance___, không phải về ___virtual functions___. – sbi

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