首页 > 试题广场 >

下面代码打印结果为()class Base {&nbs...

[单选题]
在 32 位机器上,对齐模数为 8,下面代码打印结果为()
#include <iostream>
using namespace std;

class Base {
    char data[3];
public:
    virtual void f() { 
        cout << "Base::f" << endl; 
    }

    virtual void g() { 
        cout << "Base::g" << endl; 
    }

    virtual void h() { 
        cout << "Base::h" << endl; 
    }
};
int main() {
    cout << sizeof(Base) << endl;
    return 0;
}
  • 6
  • 7
  • 8
  • 9
虽然评论区很多人讲得挺清楚了,不过还是想自己整理下,理一理(参考了很多别人的)。

C++中,如果一个类A为空,那么sizeof(A) = 1,而不是0,对于实例化的A对象:A a; sizeof(a) = 1。

C++中的成员函数(构造函数,析构函数,虚函数等)都不占用类的空间的,之前学谭浩强的<C++程序设计>时,里面是说每一个类都可能有多个实例化对象,如果每个对象的空间都要包含成员函数的话,是挺浪费空间的,只要把数据分离开,而所有的对象共用一套成员函数就可以了。

如果类中存在虚函数,那么编译器会生成一个指针指向虚函数表VTable。32bit下,指针大小为4字节;64bit下,指针大小为8字节。

还有类中的静态数据成员,它不属于任何一个该类的实例化对象,可以通过类名+作用域直接访问,也不算在类的大小里。

类似于结构体大小计算时需要内存对齐,类大小的计算也需要经过内存对齐。

sizeof(类) = 非静态数据成员 + 虚函数表的指针 + 内存对齐
发表于 2020-08-22 14:16:16 回复(1)
类中虚函数存放的只是虚函数表的指针,4个字节,加上char求组的3个字节,对齐以后就是8字节
发表于 2019-09-09 13:12:48 回复(0)
C++的编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(类)是4。
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。

编辑于 2019-11-11 11:34:37 回复(1)
sizeof(类) (类的大小与构造函数、析构函数和其它成员函数无关) 非静态数据成员+虚函数表的指针+对齐
发表于 2019-08-23 20:56:47 回复(0)
虽然评论区很多人讲得挺清楚了,不过还是想自己整理下,理一理(参考了很多别人的)。 C++中,如果一个类A为空,那么sizeof(A) = 1,而不是0,对于实例化的A对象:A a; sizeof(a) = 1。 C++中的成员函数(构造函数,析构函数,虚函数等)都不占用类的空间的,之前学谭浩强的<c>时,里面是说每一个类都可能有多个实例化对象,如果每个对象的空间都要包含成员函数的话,是挺浪费空间的,只要把数据分离开,而所有的对象共用一套成员函数就可以了。 如果类中存在虚函数,那么编译器会生成一个指针指向虚函数表VTable。32bit下,指针大小为4字节;64bit下,指针大小为8字节。 还有类中的静态数据成员,它不属于任何一个该类的实例化对象,可以通过类名+作用域直接访问,也不算在类的大小里。 类似于结构体大小计算时需要内存对齐,类大小的计算也需要经过内存对齐。 sizeof(类) = 非静态数据成员 + 虚函数表的指针 + 内存对齐</c>
发表于 2021-12-13 20:14:05 回复(0)
没看太懂,那个虚函数占多少字节?
发表于 2019-11-08 23:48:05 回复(1)
3(数组)+4(虚函数表指针)+1(对齐)=8 。注意无论类中有多少虚函数,都只是提供一个指针。个人理解
发表于 2022-03-05 16:10:08 回复(0)
32下面,空类1字节+char数组3字节+虚函数指针4字节=8字节
64下面,空类1字节+char数组3字节+虚函数指针8字节=12字节
发表于 2022-01-16 11:46:34 回复(2)
类中虚函数存放的只是虚函数表的指针,4个字节,加上char求组的3个字节,对齐以后就是8字节
发表于 2021-09-26 09:20:18 回复(0)
3(数组)+4(虚函数表指针)+1(对齐)=8 。注意无论类中有多少虚函数,都只是提供一个指针。个人理解
发表于 2021-03-10 08:43:58 回复(0)
首先,考虑Base类的成员变量。其中char data[3]占用3个字节。
虚函数表里包含虚函数的所有指针指向,类只存虚函数表的指针

接下来,考虑虚函数表指针(vptr)。在32位机器上,指针大小为4字节。由于对齐模数为8,vptr需要进行对齐,因此额外占用4个字节。

综上所述,Base类的总大小为3 + 4 = 7字节。由于对齐模数为8,所以会将其向上对齐到8字节。

发表于 2023-10-17 15:35:43 回复(0)
            题干中32位机器,如果题目不强制给对齐模数为8,正常来说32位系统对齐模数是4,64位系统对齐模数是8。
一)分析过程
1)确定分配单位,分配单位是min(对齐模数,结构体中最长的基本类型)
2)成员的偏移量,从首地址开始,添加的变量必须是其自身类型的整数倍,不是则按对齐字节的方式,空出相应的空间。
3)结构体总大小,最后全部变量放到分配空间中,此时字节数必须是分配单位的整数倍,不够则向后补齐。
二)虚函数指针和虚函数表
    在类中若存在虚函数,则类中会自动生成一个虚函数指针,指向相应的虚函数表。不管有多少个虚函数,类中只会有一个虚函数指针。(待完善)
三)类中无成员和方法,此时类的大小,为1。
四)具体分析
          32位系统下,   类大小为8字节  对齐模数为8,最长基本类型大小为4,分配单位为4.  char数组3字节+内存对齐1字节+虚函数指针4字节    1110 1111  1代表占的空间,0代表未占的空间或者内存对齐所占的空间。 
          64位系统下为 ,类大小为16字节 对齐模数为8,最长基本类型为8,分配单位为8  char数组3字节+内存对齐5字节+虚函数指针8字节  1110000 11111111 
发表于 2023-09-08 22:49:28 回复(0)
sizeof(类) = 非静态数据成员 + 虚函数表的指针 + 内存对齐
发表于 2022-02-28 23:40:51 回复(0)
4个字节,加上char数组的3个字节,对齐以后就是8字节
编辑于 2022-01-06 15:00:47 回复(0)
类中含有虚函数,编译时会生成一个指针指向虚函数表,32位系统指针4个字节(64位中指针8字节),char数组中有3个字节。内存对齐后,8字节
发表于 2021-12-06 08:36:52 回复(0)
sizeof记得内存对齐!
发表于 2021-06-20 00:59:03 回复(0)
本题存在前提是32位系统:【3+(1位补齐)+虚函数表4位】
64位系统为16:【3+(5位补齐)+虚函数表8位】
发表于 2020-12-04 15:16:27 回复(0)
在32bit下。类的存储空间: 当定义一个空类A时: sizeof(A)=1 当定义一个非空类B中: 情况一,当类中只含有(析构函数,构造函数,虚函数):sizeof(B)=4 情况二,类中含有其他数据类型和析够函数等:sizeof(B)=4+sizeof(type)+字节对齐
编辑于 2020-10-16 08:20:38 回复(0)
题目最好描述一下操作系统的类别,32位和64位的指针大小不同,不过本题可以根据排除法做
发表于 2020-04-02 09:52:23 回复(0)
默认对齐鸭,宝宝们
发表于 2019-12-09 23:00:02 回复(0)