将第一个虚拟函数添加到类中
Adding a first virtual function to a class
在类中添加第一个虚拟函数时,在内存消耗、对象布局等方面会发生什么?虚拟函数比正常函数慢多少?
如果你真的很在乎,我建议你在自己的编译器&系统,因为它可能会产生不同的结果。下面是我使用的一个例子:
#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*
成员。(注意:添加更多的虚拟函数并没有改变结果)。
根据一般经验,只有在有用的情况下才添加虚拟函数(尽管如果您的类将在层次结构中使用,则添加虚拟析构函数被认为是最佳实践,即使它总是微不足道的)。
相关文章:
- 哈希表添加函数
- 汇编错误C 在标题文件中添加函数时
- 为什么添加函数在C 11线程中无效
- 在类的快捷菜单上找不到添加函数
- 单链表添加函数-读取访问冲突
- 无法向 MFC ActiveX 添加函数
- 在运行时向对象添加函数集合
- C++ - 如何添加函数以处理货币计算器的多种情况
- 添加函数数组并随机选择其中一个
- 我正在尝试为 c++ 中的数组创建一个添加函数
- Qt从其他线程向事件循环添加函数调用
- 添加参数或添加函数
- 向typedef添加函数
- 在双链表中添加函数会导致无限循环
- 添加函数erf()和erfc()到math.h . _ C基础
- 重载<<运算符和添加函数的问题
- c++初学者.添加函数并调用它失败
- 如果在向类中添加函数时取消选中内联框,则在classname.h中只需要函数原型
- 我终于在链表中制作了我的添加函数,但不能在main中使用.:(.
- 在Qt中在c++中添加C函数时的构建问题