首页 > 试题广场 >

下面四个类A,B,C,D,在32位机器上sizeof(A),

[单选题]
下面四个类A,B,C,D,在32位机器上sizeof(A),sizeof(B),sizeof(C),sizeof(D)值分别为()
class A{
};
class B{
	char ch;
	int x;
};
class C{
public:
	void Print(void){}
};
class D
{
public:
	virtual void Print(void){}
};
  • 0,5,0,0
  • 1,8,4,4
  • 1,8,1,4
  • 1,5,1,4
推荐
答案是C
类A空类型的实例虽然不包含任何信息,但是必须在内存中占一定的空间,否则无法使用这些实例,一般都是1
类B因为内存对齐所以为8,
类C里面虽然有函数,但是只需要知道函数的地址即可,而这些函数的地址只与类型相关,而
与类型的实例无关,编译器不会因为函数而在内存中多添加任何的额外信息.所以还是1
类D因为有虚函数,C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的
每一个实例中添加一个指向虚函数表的指针.因为多了一个指针,所以在32位机器为4,64位机器为8
编辑于 2015-11-04 19:48:49 回复(5)
注意:空类编译器会将sizeof()的值变为1;
类的大小只与非静态成员和虚函数的大小有关,而与其他普通函数成员无关,与构造函数析构函数也无关。

发表于 2016-05-19 13:43:44 回复(0)
classA{
};
classB{
    charch;
    intx;
};
classC{
public:
    voidPrint(void){}
};
classD
{
public:
    virtualvoidPrint(void){}
};
参考其他牛友解析
sizeof()是针对实例的,因此类的大小只跟非static成员变量以及虚函数有关;(static变量非实例独占,sizeof()不考虑;普通成员函数,包括构造函数,被各实例共享,因此也不归sizeof()考虑)
A:空类的sizeof()为1;
B:补齐后sizeof()为8;
C:普通成员函数不考虑,类的sizeof()仍为1;
D:类中含虚函数,编译器会自动生成一个虚函数表,类需要一个指针来指向该虚表,因此类的sizeof()为4;
其他:牛友们不妨亲自建几个测试类,打印出sizeof()看一看。需要注意的是类中含虚函数且有继承时求类大小的情况,也可参考网友总结。
(回头测试完后再补充)
发表于 2016-08-03 11:56:23 回复(0)
对齐原则,char类型从内存的第0个字节开始存储,占一个字节,int是占四个字节,由于对齐原则,存放int的内存的起始地址必须是4的整数倍,即0、4、8.。。。。所以这里是4,占4个内存单元
编辑于 2017-04-05 16:35:03 回复(0)
C:
1.A空类在内存中占用1个字节;
2.B类中char占据4个字节(其中后面3个字节是为了字节对齐),int占4个字节;
3.C类,一般虚成员函数不占用内存;
4.D类,有虚函数,需要用一个虚函数指针,指向虚函数表,指针占用4个字节
发表于 2015-11-04 19:39:00 回复(0)
参考其他牛友解析
sizeof()是针对实例的,因此类的大小只跟非static成员变量以及虚函数有关;(static变量非实例独占,sizeof()不考虑;普通成员函数,包括构造函数,被各实例共享,因此也不归sizeof()考虑)
A:空类的sizeof()为1;
B:补齐后sizeof()为8;
C:普通成员函数不考虑,类的sizeof()仍为1;
D:类中含虚函数,编译器会自动生成一个虚函数表,类需要一个指针来指向该虚表,因此类的sizeof()为4;
其他:牛友们不妨亲自建几个测试类,打印出sizeof()看一看。需要注意的是类中含虚函数且有继承时求类大小的情况,也可参考网友总结。
发表于 2017-04-10 21:32:51 回复(0)
答案是C
因为c++中任意的一个对象都必须占用空间,要不然是没法标记这个对象的存在的。
对于A,虽然它是空的,但是它至少占一个字节。
对于B,由于字节对齐,一般是四个字节对齐,当然也可以是八字节对齐,但 sizeof(B)都是8,如果是2字节对齐,这个就是6了。
对于C,这个函数虽然是这个类里定义的,但是它不是被该类的对象所占有,所以在sizeof中函数是不用考虑的,所以和A一样。
对于D,任何有虚函数的对象,必须在对象的实例上绑定一个虚函数表的指针,记住,只是一个指针而已,所以虚函数表指针占用4字节。
发表于 2016-09-19 23:57:45 回复(1)
c
发表于 2022-08-17 20:08:16 回复(0)
sizeof(void)的结果是1,这表示一个void类型的大小为一个字节(即8位)。这是因为void类型表示没有类型,而C语言中所有数据类型都是以字节为单位的,所以sizeof(void)就等于1
发表于 2024-05-20 16:46:25 回复(0)
一个指针不是一般占8个字节吗?虚函数指针占4个字节是我没想到的
发表于 2021-04-27 09:07:00 回复(1)
xcn头像 xcn
1.A空类在内存中占用1个字节; 2.B类中char占据4个字节(其中后面3个字节是为了字节对齐),int占4个字节; 3.C类,一般虚成员函数不占用内存; 4.D类,有虚函数,需要用一个虚函数指针,指向虚函数表,指针占用4个字节
发表于 2018-12-30 09:17:38 回复(0)
sizeof(B)为什么是8?
发表于 2017-06-07 18:05:26 回复(1)
C
发表于 2015-11-22 15:24:10 回复(0)