3
#include <iostream>
#include <cstdlib>

using std::cout;

class A
{

public :
    A() { cout << "A()" << this << "\n";}
    ~A() { cout << "~A()" << this << "\n";}
    //void func()  { }
    virtual void debug(int a)  { cout << "A::debug";}
private :
    int a;
};

class A1 : public A
{
public :
    A1() { cout << "A1()"<< this << "\n";}
    ~A1() { cout << "~A1()"<< this << "\n";}
private :
    int a1;
};
class A2 : public A
{
public :
    A2() { cout << "A2()"<< this << "\n";}
    ~A2() { cout << "~A2()"<< this << "\n";}
private :
    int a2;
};

class B : public A1, public A2
{
public :
    B() { cout << "B()"<< this << "\n";}
    ~B() { cout << "~B()"<< this << "\n";}
    void debug() { cout << "B::debug()";  }
private :
    int a3;
};
int main()
{
    cout << "sizeof(int)" << sizeof(int) << "\n";
    cout << "sizeof(void*)" << sizeof(void*) << "\n";
    cout << "sizeof(A): " << sizeof(A) << "\n";
    cout << "sizeof(A1): " << sizeof(A1) << "\n";
    cout << "sizeof(A2): " << sizeof(A2) << "\n";
    cout << "sizeof(B): " << sizeof(B) << "\n";
    B b;
    b.debug();

}

输出 :

sizeof(int)4
sizeof(void*)4
sizeof(A): 8
sizeof(A1): 12
sizeof(A2): 12
**sizeof(B): 28**
A()0x28fef4
A1()0x28fef4
**A()0x28ff00**
A2()0x28ff00
B()0x28fef4
B::debug()~B()0x28fef4
~A2()0x28ff00
~A()0x28ff00
~A1()0x28fef4
~A()0x28fef4

A1 和 A2 都是 4(vtbl) + 4(A'sint) + 4(各自的 int) = 12 个字节,但 B 是 28 个字节我知道它不能保证,但是这 4 个字节的可能用途是什么......我没有看到任何填充问题?谁能指出我错过了什么?

4

3 回答 3

7

sizeof(A): 8

该类型A有一个类型的成员int,在您的平台中是 4 个字节。它还有一个虚函数,这意味着vptr为您的类的每个对象分配一个(虚拟表指针),它的大小是另外 4 个字节。

**sizeof(B): 28**

B包含一个类型的对象A1(12 个字节)和一个类型的对象A2(另外 12 个字节),并且它添加另一个int对象的总12+12+4 = 28字节数。这很简单。

于 2013-04-10T21:13:31.170 回答
2

结构内数据项的机器字长对齐。

有关详细信息,请参阅结构填充。

于 2013-04-10T21:08:46.990 回答
1

多重继承将产生可能不同大小的特定于实现的内存布局。 用于多重虚拟继承和类型转换的虚拟表和虚拟指针

于 2013-04-10T21:18:00.150 回答