如何确定虚拟基类及其派生类的大小
how to determine the size of virtual base class and derived classes from it?
#include <iostream>
using namespace std;
class base1{};
class base2{virtual void show(){}};
class test1{ };
class test2{virtual void show(){}};
class derv1:public virtual base1{};
class derv12:public virtual base2{};
class derv2:public virtual base2, public test1{};
class derv22:public virtual base2, public virtual test1{};
class derv222:public virtual base2, public virtual test2{};
int main()
{
cout<<"sizeof base1 = "<<sizeof(base1)<<endl;
cout<<"sizeof base2 = "<<sizeof(base2)<<endl;
cout<<"sizeof derv1 = "<<sizeof(derv1)<<endl;
cout<<"sizeof derv12 = "<<sizeof(derv12)<<endl;
cout<<"sizeof derv2 = "<<sizeof(derv2)<<endl;
cout<<"sizeof derv22 = "<<sizeof(derv22)<<endl;
cout<<"sizeof derv222 = "<<sizeof(derv222)<<endl;
}
输出:
sizeof base1 = 1
sizeof base2 = 4
sizeof derv1 = 4
sizeof derv12 = 8
sizeof derv2 = 8
sizeof derv22 = 8
sizeof derv222 = 12
我理解以下输出:
sizeof base1 : 1 => empty class , size is 1. result is OK.
sizeof base2 : 4 => since class has a virtual function, it adds
a vitual pointer in each object of the class
( 32 bit machine) , so added 4 bytes. Result is OK.
sizeof derv1 : 4 => base1 doesn't have virtual function but since
derv1 is virtually derived from base1 ,added 4 bytes.
I think that each virtual base class
added a pointer in object so i think Result is OK.
sizeof derv12: 8 => 4 bytes( from virtual pointer) + 4 bytes
(virtual base class ) = 8 bytes. Result is OK.
我的困惑开始于以上输出之后
sizeof derv2 : 8 => 8 bytes( virtual pointer + virtually base class)
from base2 + 1 byte from test1 => 9 bytes and adds 3 padding
bytes gives 12 bytes (should print).
why "sizeof (test1)" is not adding in the output ??
sizeof derv22 : 8 => 8 bytes( virtual pointer + virtually base class)
from base2 + 4 byte (virtually base class)
from test1 => 12 bytes (should print)
why 4 bytes from test1 (virtual base class) is not added
in the output?? In the size of(derv1 ) also has
a virtual base class( base1) and out put is 4 bytes means
they added 4 bytes in the output.
sizeof derv222: 12 => 12 bytes( virtual pointer + virtually derived)
from base2 + 8 byte( virtual pointer + virtually derived)
from test2 => 16 bytes (should print)
我是不是遗漏了什么,比如这些尺寸取决于系统还是其他什么??
sizeof(base1)
和sizeof(test1)
为1的原因仅为,以防止派生程度最高的对象的大小为0。这就是标准所禁止的。基类子对象的大小允许为0(也就是说,不允许占用任何字节(,因此添加base1
作为基不必必须向类的大小添加任何内容。
编译器进行的优化,不为类型为空类的基类子对象分配任何字节,称为"空基类优化"。标准不要求实现应用它,但不应用它的实现可能不适合严肃的工作。
我认为derv22
有点类似-如果编译器能够使用一个额外的指针处理两个虚拟基类,那么它有权这样做。因此,你可能只需要"支付"一次,而不是"支付"每个虚拟基类。这可能取决于编译器和类之间的确切关系,不过,我从未调查过不同的实现,看看它们是否以及何时被迫添加相当于开销的多个指针。
不过,显然derv222
已经做到了,至少对您的编译器来说是这样。我想这是因为base2
和test2
基类子对象需要单独的vtable指针。如果考虑将static_cast
和derv222*
作为一个基或另一个基的指针时会发生什么,可能并不奇怪——这两个结果都需要能够调用show()
,并调用不同的函数(尽管show
函数目前什么都不做(。我不确定另一个编译器是否有可能在8字节中实现这种继承——首先,继承不需要使用vtables来实现。
如何确定虚拟机的大小基类和派生类它
使用sizeof()
。
我的旧论文《C++:在引擎盖下》解释了Microsoft C++对虚拟基类的实现。http://www.openrce.org/articles/files/jangrayhood.pdf
您可以使用cl/d1reportAllClassLayout进行编译,以获得类内存布局的文本报告。
黑客快乐!
在虚拟(访问说明符(模式(例如,虚拟公共(中继承基类的Empty类的大小为8,而如果不为空,则其大小为16。
- 为什么使用 "this" 指针调用派生成员函数?
- 如何确定我已使用非编码文件到达 EOF?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 用于确定一个类是否派生自另一个类的代码说明
- 如何确定一个类是否没有派生自它的类
- 什么是C++中的不确定行为?它与未定义的行为有何不同
- 如何从指向GDB基类的指针确定对象是否是某个派生c++类的实例
- 如何确定虚拟基类及其派生类的大小