sizeof(类名)是vtbl的size吗?

JoshuaLi 2002-12-04 03:05:37
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)

...全文
76 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoshuaLi 2002-12-06
  • 打赏
  • 举报
回复
多谢,好象现在的公司都很喜欢从《...exception...》,《...effective...》,《...essential...》里面抄题目。
cbc 2002-12-04
  • 打赏
  • 举报
回复
4字节的要在4倍地址开始;2字节的要在2倍地址开始;而1字节可以在1倍地址(既任意地址)开始。所以:char ch; short sh;是这样的:
|--------|--------|--------|--------|
|char ch | null | short sh |
short;char;char:
|--------|--------|--------|--------|
| short | char | char |
bool是1字节,那么可以当char看。
cbc 2002-12-04
  • 打赏
  • 举报
回复
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
cbc 2002-12-04
  • 打赏
  • 举报
回复
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;
nscboy 2002-12-04
  • 打赏
  • 举报
回复
同意ruihuahan(飞不起来的笨鸟)
ccck1111 2002-12-04
  • 打赏
  • 举报
回复
同意楼上几位
gyf 2002-12-04
  • 打赏
  • 举报
回复
同意楼上的
nustchenhf 2002-12-04
  • 打赏
  • 举报
回复
agree with ruihuahan(飞不起来的笨鸟)
ruihuahan 2002-12-04
  • 打赏
  • 举报
回复
是vtbl的size吗?

vtbl不是对象大小的一部分,而指向vtbl的vptr是对象大小的一部分。
wanglei888 2002-12-04
  • 打赏
  • 举报
回复
sizeof一个变量名:取这个变量所占用的内存的长度
sizeof一个类型名:取这个类型的变量所占用的内存的长度

sizeof不是函数,在编译之前编译器都已经计算好了sizeof对应的值
dai2255 2002-12-04
  • 打赏
  • 举报
回复
1。sizeof()是函数,判断编译器生成的类的大小,返回值为size_t(无符号整型)
2。没有

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧