帮忙看下sizeof()函数题

[复制链接]
查看11 | 回复4 | 2010-5-12 13:36:51 | 显示全部楼层 |阅读模式
存在如下三个类的定义,请问sizeof(A)、sizeof(B)、sizeof(C)分别等于多少?
class A
{
void FuncA();
};
class B
{
int a; char ch;
static int b;
virtual void FuncA();
};
class C
{
double d; char ch;
virtual void FuncA();
virtual void FuncB();
};

回复

使用道具 举报

千问 | 2010-5-12 13:36:51 | 显示全部楼层
这个问题非常棒!首先sizeof 取类大小,即数据成员大小.但不能包括静态成员,因为是static相对整个类而言,而不是单个对象.所以在class B里的static int b,不算大小.再看,函数.函数调用其实在编译器处理是把对象的this指针传过去进行调用,所以函数不占空间.(我的意思是对sizeof操作函数无影响,编译器当然要保存每个类的所有函数,即处理的符号表). 但是对虚函数来说,就不同了.由于要进行动态关联,不能由编译器静态关联.所以办法是在每个类开始,定义了一个指针,指向虚函数表,即sizeof时要算上这个指针.再来,就是对齐的问题了.类class的处理和结构struct的处理非常相似,为了处理方便,按照最大宽度
回复

使用道具 举报

千问 | 2010-5-12 13:36:51 | 显示全部楼层
sizeof(A)=1,普通函数不占大小,相当于空类。空类大小为1,编译器安插一个char给空类,标记为空类的对象sizeof(b)=12,int 占4char 占 1,static不占大小,一个虚函数表指针 4,总数为9,考虑数据对齐为int整数倍,所以12sizeof(c)=24,double 8 char 1,2个虚函数表指针8,按照dou
回复

使用道具 举报

千问 | 2010-5-12 13:36:51 | 显示全部楼层
A 是1 , 因为不允许一个东西的size是0的B 是 4 + 4 + 4 char占4因为对齐(如果没有修改对齐设置的话), 虚函数表占4字节C 估计会跟编译器有点关系, 主要看默认的对齐方式是什么, 8 + 4 + 4和8+8+8都可能
回复

使用道具 举报

千问 | 2010-5-12 13:36:51 | 显示全部楼层
sizeof(A)=1, 如果类中没有成员变量(也就是没有会占用内存的, 注:成员变量占内存, 成员函数不占), 那么该类会自动产生一个点位符, 也就是sizeof(类名)=1, 否则定义该类数组的时候会出错(因为如果sizeof()返回0的话, 无法使用指针才访问该数组各个元素了).sizeof(B)=12, 这个要注意两点: 一是类的静态成员是所有类
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行