类占用字节大小的计算
class a{ \\占用了8个字节
public:
short int sia;
virtual void funa(){};
};
class b:public a\\占用了12个字节
{
public:
int x;
virtual void funb(){};
};
class c:public a\\占用了8个字节
{
public:
virtual void func(){};
};
int main()
{
cout<<"the size of the a is :"<<sizeof(a)<<endl;
cout<<"the size of the b is :"<<sizeof(b)<<endl;
cout<<"the size of the c is :"<<sizeof(c)<<endl;
int abc;
cin>>abc;
return 1;
}
在这些类中这些占用字节是如何算的,为什么类a的虚函数占用了,而其子类的却没有占用?
如下的这个又是如何算的呢?
struct a
{ int a:4;
long b:16;
}
问题点数:20、回复次数:9Top
1 楼ykzhujiang(朱朱)回复于 2006-03-13 14:12:10 得分 0
这里面涉及到许多相关知识,比如关于虚函数的VTable,VPtr以及字节对齐问题,还有占位符、内存布局等等,楼主可以搜索以下这些相关的基础知识,这样你才会对于一个类所占用的空间有一个清楚的认识Top
2 楼ydfivy(我就是一送外卖的)回复于 2006-03-13 14:52:46 得分 0
在派生类的虚函数表中,有基类的虚函数,还有派生类的虚函数.
这样在派生类中只要保留一个指向虚函数表的指针就可以了.Top
3 楼zh2817()回复于 2006-03-13 15:20:00 得分 0
不管是基类,还是派生类,楼主你是想要“类”的大小,你的程序(思路)行吗??Top
4 楼ytfrdfiw()回复于 2006-03-13 15:48:23 得分 0
建议楼主看一下inside the c++ object model,lippman写的,侯杰译Top
5 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-13 16:23:03 得分 10
class a{ \\占用了8个字节
public:
short int sia; //4(因为要对齐)
virtual void funa(){}; //4
};
class b:public a\\占用了12个字节
{
public:
//short int sia(基类) //4(因为要对齐)
int x; //4
virtual void funb(){}; //4
};
class c:public a\\占用了8个字节
{
public:
//short int sia(基类) //4(因为要对齐)
virtual void func(){}; //4
};
有虚函数的类都有个指向vtable的指针,大小为4Top
6 楼pyrophile(豆子(天上云彩往下飘))回复于 2006-03-13 17:46:05 得分 0
class a{ \\占用了8个字节
public:
short int sia; //8(因为要对齐)
virtual void funa(){}; //这个好像不站空间吧?
};Top
7 楼defyer007(深入浅出)回复于 2006-03-13 18:07:59 得分 10
class a{ \\占用了8个字节
public:
short int sia;
virtual void funa(){};
};
class b:public a\\占用了12个字节
{
public:
int x;
virtual void funb(){};
};
class c:public a\\占用了8个字节
{
public:
virtual void func(){};
};
有虚函数则占一个4Bytes,为指向虚函数表的一个指针,然后其他的成员按对齐方式占用Top
8 楼pyrophile(豆子(天上云彩往下飘))回复于 2006-03-14 10:20:40 得分 0
学习了Top
9 楼san_126(阿三)回复于 2006-03-14 11:25:14 得分 0
同意cenlmmx(学海无涯苦作舟) ,但不同编译器默认的对齐字节数是不同的,VC6好像是8吧Top




