gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:13 26 4
gpt4 key购买 nike

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

最佳答案

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

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com