2013-04-10 51 views
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(); 

} 

输出:我的4字节在哪里?

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个字节的可能是什么......我没有看到任何填充问题?任何人都可以指出我错过了什么?

+2

尽管你没有看到它们,但填充问题在那里,并寻找更多的受害者。 – 2013-04-10 21:08:51

+4

我一定错过了一些东西。 :耸耸肩:但你刚刚说过,每个A1和A2类都是12个字节。然后你已经显示B从它们中的每一个继承,并添加另一个int。我的简单思想是做12 + 12 + 4 = 28,并问'嗯?我不明白,什么缺少4个字节?' – enhzflep 2013-04-10 21:11:52

+0

oops我完全错过了我在B中添加了一个int也...我也错误地怀疑A2的地址是前面4个字节... – mhk 2013-04-10 21:22:31

回答

7

sizeof(A): 8

类型A具有int类型中的哪些平台是4个字节的成员。它也有一个虚函数,这意味着一个vptr(虚拟表指针)被分配给你的类的每个对象,它的大小是另外4个字节。

**sizeof(B): 28**

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

+1

要认识到的重要一点是,由于多重继承将会有两个* vptrs,子对象不能共享一个。 – 2013-04-10 21:16:41

+0

@MarkRansom:对,我完全错过了,因为我不清楚他为什么可能会丢失4个字节:) – 2013-04-10 21:25:27

+0

@MarkRansom; @ DavidRodríguez - dribeas:是的,这很重要,无论如何2个vtbl ptrs在A1和A2的大小;所以我错误地怀疑我缺少4个字节 – mhk 2013-04-10 21:29:11

2

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

有关更多信息,请参阅结构包装。

+0

如果没有包装,一切都会对齐。如果一个项目的大小等于字的大小,那么就没有必要的填充 – KevinDTimm 2013-04-10 21:16:49