int main(int argc, char* argv[])
{
class a{};
class b:virtual public a{};
class c:virtual public a{};
class d:public b,public c{};
int i1,i2,i3,i4;
i1=sizeof a;
i2=sizeof b;
i3=sizeof c;
i4=sizeof d;
cout<<sizeof(i1)<<endl;
cout<<sizeof(i2)<<endl;
cout<<sizeof(i3)<<endl;
cout<<sizeof(i4)<<endl;
return 0;
}
请教:1. a,b,c,d 中都没有virtual function, "sizeof(类名)" 是什么意思?(是vtbl的
size吗?)2. 一个类含有virtual function时有一个vtbl, 如果没有virtual function时就没
有一个函数指针表吗?(function pointer table)
{
class a{};
class b:virtual public a{};
class c:virtual public a{};
class d:public b,public c{};
int i1,i2,i3,i4;
i1=sizeof a;
i2=sizeof b;
i3=sizeof c;
i4=sizeof d;
cout<<sizeof(i1)<<endl;
cout<<sizeof(i2)<<endl;
cout<<sizeof(i3)<<endl;
cout<<sizeof(i4)<<endl;
return 0;
}
请教:1. a,b,c,d 中都没有virtual function, "sizeof(类名)" 是什么意思?(是vtbl的
size吗?)2. 一个类含有virtual function时有一个vtbl, 如果没有virtual function时就没
有一个函数指针表吗?(function pointer table)
2。没有
sizeof一个类型名:取这个类型的变量所占用的内存的长度sizeof不是函数,在编译之前编译器都已经计算好了sizeof对应的值
类的大小等于基类的大小+子类个non-static成员变量的大小,这里成员变量是会被字节对齐的。就像楼上所说的那样。
如果有虚函数,类的大小+4个字节。(用来存放vptr)
如果是虚继承,虚基类的大小不算了,但是要算4个字节(用来存放指向虚基对象的指针)综上所述:class A
{
virtual void foo();
int i;
char c;
}; sizeof(A) = 12 = vptr + sizeof(i) + (sizeof(c) +3);class B :public A
{
void foo1();
static int haha;
long ll;
} sizeof(B) = 16 = sizeof(A) + sizeof(ll);class C : virtual pubilc A
{
char sz[10];
} sizeof(C) = 20 = vptr + vbtr + sizeof(sz) +2;
class a{};
因为当 class a m;时m一定要有一个确定的内存地址,而如果编译器不用一个char 来暗中占位,那怎么实现呢?]
i2,i3为什么是4?
因为i2体内应有一个指向BASE CLASS内容的virtual base class pointer
一个指针大小为4,那一个CHAR还要不要,要依编译器而定,VC中进行了这种优化,已经有一个指针了,就不要那个CHAR了,如果不支持这种优化我想结果大概是8,因为还要进行内存对齐。
i4=8的原因
D体内应有一个公用的A类和BC中除去A类的部分,因为优化所以为
4 + 4 =8
|--------|--------|--------|--------|
|char ch | null | short sh |
short;char;char:
|--------|--------|--------|--------|
| short | char | char |
bool是1字节,那么可以当char看。