c++ - 向类中添加第一个虚函数

标签 c++

当您在内存消耗、对象布局等方面向类添加第一个虚函数时会发生什么情况?虚函数比普通函数慢多少?

最佳答案

如果您真的很在意,我建议您在自己的编译器和系统上对其进行测试,因为它可能会产生不同的结果。这是我使用的示例:

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

产生了以下输出(使用 Windows 10/Visual C++ 14.0 编译为“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

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

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

关于c++ - 向类中添加第一个虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36972519/

相关文章:

c++ - 如何初始化 char*[] 数组?

c++ - 在 C++ 程序中查找 linux 中已安装的程序

c++ - C++/Qt - 内存分配如何工作?

C++ - 初始化结构的有效方法

c++ - __throw_bad_alloc() 有什么作用?

c++ - 使用 `cout` 在控制台查看二进制数据

c++ - 在 C++ 中使用重载 * 运算符与括号结果相乘

c++ - 带 std::index_sequence 的三元运算符

C++ 错误 : because the following virtual functions are pure within

c++ - 使用悬停事件