空类的大小和派生虚拟类
Size of a empty Class & Derived Virtual Class
1.为什么Derived4类的大小显示8个字节??
class Empty
{};
class Derived4 : virtual public Empty
{
char c;
};
2.而Derived2类的大小显示为4字节??
class Empty
{};
class Derived2 : virtual public Empty
{};
请注意,sizeof(any_class)
是实现定义的。
但在你的情况下实际发生了什么。好吧,它使用virtual
继承,大多数实现都使用隐藏指针来实现这一功能,该功能需要sizeof(pointer)
字节(指针存储在派生类本身中),加上所有成员的大小(如果有的话),加上填充,如果需要,加上基类的大小(在空基类的情况下,由于空基类优化,可以将其减少为零)。
有关更详细的答案,请在此网站上搜索"C++中的填充"。你会在上面找到很多主题。
为什么
Derived4
类的大小显示为8个字节?class Empty {}; class Derived4 : virtual public Empty { char c; };
在32位机器g++下,为一个空类生成1个字节(以便表示内存中的类名)。这是一种有意的行为。
您将继承Derived4
中的Empty
作为virtual public
,结果编译器在类Derived4
中创建__vptr
变量作为默认值。所以类Derived4
看起来像这样,
class Derived4 {
void* __vptr; // 4 bytes
char c; // 4 bytes as 1 char + 3 for structure padding
};
所以上面类的大小是8字节,我希望你同意。
而
Derived2
类的大小显示为4字节?class Empty {}; class Derived2 : virtual public Empty {};
这里,相同的原理适用于空的类1字节,并继承Derived4
中的Empty
作为插入Derived4
类中的虚拟结果__vptr
变量。所以,Dervied4
的大小是sizeof(void*)
;它只不过是32位机器中4个字节的大小。
我想在Saravanan语句中添加一个事实,即空类的大小不是0字节,但当用作基类时,由于EBCO(空基类优化),基类的"开销"被消除了。
相关文章:
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 虚拟基类函数中派生类的大小
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 派生类中纯虚拟基方法的专业化
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- 无法在派生对象上运行虚拟函数
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 从基调用派生类的隐藏(非虚拟)方法
- 派生类可以有多个指向虚拟表的指针
- 如何从派生类函数中调用虚拟函数
- C++虚拟函数:基类函数是调用的,而不是派生的
- 空类的大小和派生虚拟类
- C++ STL:使用派生虚拟类作为 std::sort() 的"Strict Weak Ordering"