将第一个虚拟函数添加到类中

Adding a first virtual function to a class

本文关键字:添加 函数 第一个 虚拟      更新时间:2023-10-16

在类中添加第一个虚拟函数时,在内存消耗、对象布局等方面会发生什么?虚拟函数比正常函数慢多少?

如果你真的很在乎,我建议你在自己的编译器&系统,因为它可能会产生不同的结果。下面是我使用的一个例子:

#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();
}   

它产生了以下输出(使用编译为"x64"程序的Windows 10/Visual C++14.0)

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

这表明,在类中添加一个虚拟函数相当于在末尾添加一个void*成员。(注意:添加更多的虚拟函数并没有改变结果)。

根据一般经验,只有在有用的情况下才添加虚拟函数(尽管如果您的类将在层次结构中使用,则添加虚拟析构函数被认为是最佳实践,即使它总是微不足道的)。