为什么基类的大小显示为16字节?

时间:2013-09-27 05:18:06

标签: c++ linux virtual

我有以下基类,我检查了这个类的大小,它显示 16个字节。 如果我从 fun(),中删除虚拟关键字,则会显示 4个字节。

我不明白这种行为。任何指针?

class base
{
        public :
        int a;
        virtual void fun()
        {
        }
};

gcc版本:gcc版本4.1.2 20080704

OS:Linux 2.6.18-308.el5#1 SMP Fri 1月27日17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU / Linux

3 个答案:

答案 0 :(得分:7)

您的编译器显然在每个实例中存储一个指针以支持虚拟调度机制(这很常见,它被称为v表指针)。由于您使用的是64位体系结构,因此它们都会增加8个字节的大小,并使对齐为8个字节。大小总是必须是对齐的倍数,以使数组元素的对齐起作用,因此对齐原因将有4个字节的填充,总共16个。

答案 1 :(得分:1)

要在运行时实现虚方法或虚基类的多态行为,编译器实现会添加某些隐藏成员。这是编译器和平台特定的行为。任何多态类的大小可以在编译器的不同实现中变化。

这使得C ++对象内存模型与C内存模型不兼容。

答案 2 :(得分:0)

“任何指针”实际上都是正确的猜测。除了显式声明的数据字段之外,每个多态类还存储一些额外的“隐藏”信息。在典型的实现中,它将存储指向所谓的虚拟方法表(VMT)的指针。该指针的大小恰好是在你的情况下为类的大小贡献额外字节的原因。

显然,您正在使用64字节平台编译代码,该平台使用8字节指针。因此,对于VMT指针,类的总大小为8,对于int a字段为4,为了将类大小与8字节边界对齐,还有4个填充字节。如果以32位模式编译代码,则此类的sizeof可能会计算为8。

在单继承层次结构中,所有类通常将“共享”层次结构中最顶层多态类引入的指针,这意味着任何多态类的大小都会增加单个指针的大小。但是在多继承层次结构中,最终可能在单个类中有多个隐藏的VMT指针,这意味着这个类的大小将增加多个指针的大小。