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)

...全文
83 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,548

社区成员

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

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

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