2016-05-01 33 views
5

Đ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

+2

http://stackoverflow.com/questions/449827/virtual-functions-and-performance-c –

+2

http://stackoverflow.com/questions/99297/how-are-virtual-functions-and-vtable-implemented –

+0

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. –

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