Điều gì sẽ xảy ra khi bạn thêm một hàm ảo đầu tiên vào một lớp về mức tiêu thụ bộ nhớ, bố cục đối tượng, v.v. Các hàm ảo chậm hơn bao nhiêu so với các hàm bình thường?Thêm chức năng ảo đầu tiên vào một lớp học
5
A
Trả lời
2
Nếu bạn thực sự quan tâm, tôi khuyên bạn nên thử nghiệm nó trên trình biên dịch của riêng bạn & hệ thống, vì nó có thể tạo ra các kết quả khác nhau. Dưới đây là một ví dụ tôi sử dụng:
#include <iostream>
template<typename B> struct Base { B b; void f() {}; };
template<typename B> struct Base_Virtual { B b; virtual void f() {}; };
template<typename B> struct Base_Pointer { B b; void* p; };
#define PRINT_ALIGNOF_SIZEOF(T) std::cout << "sizeof(" #T ") = " << sizeof(T) << ", alignof(" #T ") = " << alignof(T) << std::endl
int main()
{
PRINT_ALIGNOF_SIZEOF(char);
PRINT_ALIGNOF_SIZEOF(Base<char>);
PRINT_ALIGNOF_SIZEOF(Base_Virtual<char>);
PRINT_ALIGNOF_SIZEOF(Base_Pointer<char>);
std::cout << std::endl;
PRINT_ALIGNOF_SIZEOF(void*);
PRINT_ALIGNOF_SIZEOF(Base<void*>);
PRINT_ALIGNOF_SIZEOF(Base_Virtual<void*>);
PRINT_ALIGNOF_SIZEOF(Base_Pointer<void*>);
std::cin.ignore();
}
nào sản xuất đầu ra sau đây (với Windows 10/Visual C++ 14.0 biên soạn như một chương trình 'x64')
sizeof(char) = 1, alignof(char) = 1
sizeof(Base<char>) = 1, alignof(Base<char>) = 1
sizeof(Base_Virtual<char>) = 16, alignof(Base_Virtual<char>) = 8
sizeof(Base_Pointer<char>) = 16, alignof(Base_Pointer<char>) = 8
sizeof(void*) = 8, alignof(void*) = 8
sizeof(Base<void*>) = 8, alignof(Base<void*>) = 8
sizeof(Base_Virtual<void*>) = 16, alignof(Base_Virtual<void*>) = 8
sizeof(Base_Pointer<void*>) = 16, alignof(Base_Pointer<void*>) = 8
Điều này cho thấy rằng việc thêm một chức năng ảo để một lớp tương đương với việc thêm thành viên void*
vào cuối. (Lưu ý: thêm nhiều chức năng ảo không thay đổi kết quả). Một nguyên tắc chung, chỉ thêm các hàm ảo nếu chúng có ích (mặc dù thêm một destructor ảo được coi là thực hành tốt nhất nếu lớp của bạn sẽ được sử dụng trong các cấu trúc phân cấp, thậm chí nếu nó luôn là tầm thường).
Các vấn đề liên quan
- 1. Scala - chi phí gọi 'chức năng lớp học đầu tiên'
- 2. Lớp học có chức năng ảo không? C++
- 3. Bất kỳ sự khác biệt nào giữa chức năng lớp học đầu tiên và chức năng đặt hàng cao
- 4. Quá tải một chức năng ảo trong một lớp học trẻ em
- 5. "C# lớp cơ sở chức năng ảo" - "ghi đè trong lớp học quản lý C++"
- 6. thêm lớp học vào collection_select
- 7. C++: Các chức năng ảo cần gọi cùng một mã?
- 8. chức năng ảo const vs chức năng ảo không const
- 9. Thừa kế chức năng ảo
- 10. chức năng ảo tư nhân ở có nguồn gốc lớp
- 11. Chức năng tĩnh bên ngoài lớp học
- 12. Chức năng đầu vào đầu vào nhanh
- 13. C++ chức năng ảo không được gọi trong lớp con
- 14. Chức năng gọi từ một lớp học khác nhanh chóng
- 15. Thêm mô tả lớp học vào mã?
- 16. Thêm lớp vào f.submit nhưng giữ chức năng mặc định?
- 17. Thêm chức năng mới vào giao diện
- 18. Scala: các vấn đề khi sử dụng các chức năng như đối tượng lớp học đầu tiên
- 19. Gọi chức năng ảo thuần túy từ chức năng thành viên lớp cơ sở trừu tượng?
- 20. chuyển một hàm tăng :: vào mẫu; những gì lớp học được tăng :: chức năng
- 21. Khi nào bạn nên hạn chế khả năng truy cập vào một chức năng ảo trong một lớp dẫn xuất?
- 22. Chức năng ảo có thể bị ghi đè bởi một chức năng phi ảo không?
- 23. Làm thế nào để thêm lớp học cho con đầu tiên với jQuery?
- 24. Thêm lớp học vào phần tử select2
- 25. thêm một chức năng trang trí cho một lớp
- 26. Câu hỏi với các chức năng ảo
- 27. Simple_form thêm lớp học vào mẫu
- 28. Biến toàn cục Python và chức năng lớp học
- 29. Các lớp học đầu tiên của bạn có phải là các lớp miền của bạn không?
- 30. Force gọi lớp cơ sở chức năng ảo
http://stackoverflow.com/questions/449827/virtual-functions-and-performance-c –
http://stackoverflow.com/questions/99297/how-are-virtual-functions-and-vtable-implemented –
Thật là một gợi ý tuyệt vời mà bạn đã thực hiện: để tạo ra một vài chương trình đơn giản có thể được đo điểm chuẩn để xác định chi phí của các lớp ảo. Hãy chắc chắn chỉnh sửa câu hỏi của bạn để bao gồm kết quả điểm chuẩn của bạn. –