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)

解决方案 »

  1.   

    1。sizeof()是函数,判断编译器生成的类的大小,返回值为size_t(无符号整型)
    2。没有
      

  2.   

    sizeof一个变量名:取这个变量所占用的内存的长度
    sizeof一个类型名:取这个类型的变量所占用的内存的长度sizeof不是函数,在编译之前编译器都已经计算好了sizeof对应的值
      

  3.   

    是vtbl的size吗?vtbl不是对象大小的一部分,而指向vtbl的vptr是对象大小的一部分。
      

  4.   

    agree with ruihuahan(飞不起来的笨鸟)
      

  5.   

    同意ruihuahan(飞不起来的笨鸟)
      

  6.   

    C++中类的成员函数,静态成员是不占类的大小的。
    类的大小等于基类的大小+子类个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;
      

  7.   

    i1为什么是1
    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
      

  8.   

    4字节的要在4倍地址开始;2字节的要在2倍地址开始;而1字节可以在1倍地址(既任意地址)开始。所以:char ch; short sh;是这样的:
    |--------|--------|--------|--------|
    |char ch |  null  |   short  sh     |
    short;char;char:
    |--------|--------|--------|--------|
    |      short      |  char  |  char  |
    bool是1字节,那么可以当char看。
      

  9.   

    多谢,好象现在的公司都很喜欢从《...exception...》,《...effective...》,《...essential...》里面抄题目。