首页 > 试题广场 >

32位机器上,有三个类A B C定义如下, 请确定sizeo

[单选题]
32位机器上,有三个类A B C定义如下, 请确定sizeof(A) sizeof(B) sizeof(C)的大小顺序.
struct A{
    A() {}
    ~A() {}
    int m1;
    int m2;
};
struct B:A{
    B() {}
    ~B() {}
    int m1;
    char m2;
    static char m3;
};
struct C{
    C() {}
    virtual~C() {}
    int m1;
    short m2;
};
  • A=B=C
  • A<B<C
  • A=C<B
  • A<C<B
推荐
答案:选D
答案解析:类的大小只与成员变量(非static数据成员变量)和虚函数指针有关,还要考虑到对齐. 
那么类A的大小是8个字节;
类B继承类A,在类A的8个字节基础上,再加上B自己的大小8字节,所以类B大小是16个字节;
类C是4个字节+4个字节(考虑对齐)+4个字节(指向虚析构函数的指针)=12个字节
编辑于 2014-12-30 15:41:14 回复(17)
Examples:
//空类:
class CBase
{ };
空类也会被实例化,编译器会给空类隐含的添加一个字节,sizeof()的结果是1。

//这个也是空类
class Base
{
public:
Base();
~Base();
}; //1字节

class CBase
{
public:
CBase(void); //其他成员函数不归入sizeof统计
virtual ~CBase(void); //虚析构函数 virtual ~Base() 的指针占4子字节
private:
int  a;   //32位机器上,32 / 8 = 4 字节
char *p;  // 同上 4字节
};//一共 4 + 4 + 4 = 12 字节

class Derive:public Base  //Derive类首先要具有Base类的部分,也就是占12字节
{
public:
Derive():Base(){};
~Derive(){};
private:
static int st;         //非实例独占 ,  static int st;不归入sizeof统计
int  d;                     //占4字节
char *p;                    //4字节指针
};  //12 + 8 = 20 字节

1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。

2.普通成员函数与sizeof无关。

3.虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节。

4.类的总大小也遵守类似class字节对齐的,调整规则。

//32位机器上,有三个类A B C定义如下, 请确定sizeof(A)=8 sizeof(B)=8+5+对齐=16 sizeof(C)=10+对齐=12的大小顺序.
struct A{
A() {}
~A() {}
int m1; // 4
int m2; // 4
};
struct B:A{
B() {}
~B() {}
int m1; // 4
char m2;  // 1
static char m3;
};
struct C{
C() {}
virtual~C() {} // 4
int m1; // 4
short m2; // 2
};



32位编译器:
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int:  4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   4个字节
long long:  8个字节
unsigned long:  4个字节
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int:  4个字节
unsigned int : 4个字节
float:  4个字节
double:   8个字节
long:   4个字节
long long:  8个字节
unsigned long:  8个字节
编辑于 2019-04-11 00:53:44 回复(6)
首先结构体A的大小为8,很容易求出;
结构体B继承A,则B的起始存储大小从第8哥字节开始,(cout<<offsetof(B,m1)<<endl;)static对结构体本身大小没有影响,另外根据结构体的规则可知,其大小为最大对齐数(4)的倍数。(本来算得14)所以为16;
结构体C中有个虚函数,所以包含虚函数指针,占4个字节,(本来算得大小为10,其大小为最大对齐数(4)的倍数),所以其大小为12.
发表于 2015-04-08 18:53:58 回复(3)
在类中构造函数与析构函数不占内存,切记
发表于 2015-08-15 09:53:21 回复(0)
答案:选D 答案解析:类的大小只与成员变量(非static数据成员变量)和虚函数指针有关,还要考虑到对齐.  那么类A的大小是8个字节; 类B继承类A,在类A的8个字节基础上,再加上B自己的大小8字节,所以类B大小是16个字节; 类C是4个字节+4个字节(考虑对齐)+4个字节(指向虚析构函数的指针)=12个字节
发表于 2021-11-24 15:24:25 回复(1)
虚函数需要一个指针,所以C占12个字节。a
发表于 2018-01-19 11:34:53 回复(0)
#include <iostream>
using namespace std;

struct A
{
	A()
	{
	}
	~A()
	{
	}
	int m1;
	int m2;
};
struct B :A
{
	B()
	{
	}
	~B()
	{
	}
	int m1;
	char m2;
	static char m3;
};
struct C
{
	C()
	{
	}
	virtual~C()
	{
	}
	int m1;
	short m2;
};


int main()
{
	cout << "sizeof(A): " << sizeof(A) << endl;
	cout << "sizeof(B): " << sizeof(B) << endl;
	cout << "sizeof(C): " << sizeof(C) << endl;
	cin.get();
	return 0;
}

32位的编译器



这是64位的

编辑于 2017-07-16 09:28:02 回复(0)
结构体是类的一种形式,只是以class定义的类具有public private protected三种访问权限,而由struct定义的则都是public访问权限;
类的大小只与成员变量(非static数据成员变量)和虚函数指针有关(其他函数指针,无论函数是否为空都没有关系),还要考虑对齐。
发表于 2017-02-19 21:44:13 回复(0)
sizeof(A) = 8,sizeof(B) = 16,sizeof(C) = 12 
发表于 2017-01-16 21:49:36 回复(0)
注意对齐 注意BA的继承关系
发表于 2016-10-10 17:42:07 回复(0)
B=8+4+4
发表于 2024-01-02 09:55:39 回复(0)
这是c++吧?怎么题是混的?

发表于 2022-08-31 12:26:20 回复(0)
继承父类需要加上父类成员空间

发表于 2021-03-10 13:16:20 回复(0)
注意b继承了a, a 两个int 8字节 b 自己增加的,8字节 加上a 总共16字节 c 12个字节 注意虚函数 4个字节
发表于 2019-12-18 16:23:16 回复(1)
sizeof运算符不考虑static类型变量,虚析构函数指针占4个字节,故选D。
发表于 2018-11-18 22:10:14 回复(0)
类的大小只与非静态成员变量、虚指针有关
发表于 2018-10-04 19:33:05 回复(0)
   我的64位机上测试是ABC分别为8,16,16,谁能解释下吗?
发表于 2018-09-26 23:50:18 回复(1)
虚表指针占用4字节
发表于 2018-04-24 14:54:34 回复(0)
有人知道 为什么 一个空的类或者结构 sizeof是1  那加上里面两个4字节的int型变量 不是应该变成9 吗?为什么还是8
发表于 2017-09-25 16:39:51 回复(1)
vatrual是指针
发表于 2017-09-21 16:05:16 回复(0)