【牛客 题库】 类的大小 联合体的大小 结构体的最大对齐数

1.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;
};
解答:8,16,12

答案解析:类的大小只与成员变量(非static数据成员变量)和虚函数指针有关,还要考虑到对齐. 

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:   8个字节
      long long:  8个字节
      unsigned long:  8个字节

类A的大小是8个字节;

类B继承类A,在类A的8个字节基础上,再加上B自己的字节,B自己的字节为:4+1,static数据成员变量不算,考虑到根据结构体的规则可知,其大小为最大对齐数(4)的倍数。所以B自己的字节为4+4=8,一共是16.

类C中,int是4个字节,虚指针是4个字节,short是2个字节,向最大对齐数对齐,所以是4+4+4=12.

下面是一个讲结构体中数据对齐的博客:C/C++数据对齐

示例:

struct Test1
{
    int i ;
    double d ;
    char c ;
};

int是4个字节,double是8个字节,char是一个字节,向最大的对齐,所以int和char都为8个字节,结果是24个字节。

2.联合体的大小

int  2 个字节, char  1 个字节, float  4 个字节, sizeof(xc) 大小是:

struct stu
{
union{
char bj[5];
int bh[2];
} class;
char xm[8];
float cj;
}xc;

解答:20

内存对齐规定:结构体的总大小为结构体最宽基本类型成员大小的整数倍

首先计算联合体内的字节数目: 

  • 联合体大小要至少能容纳最大的成员变量
  • 联合体大小要是所有成员变量类型大小的整数倍
  • struct stu
    {
    union{
    char bj[5];// 5 
    int bh[2]; // 4
    } class; // union 总大小为 5,但需要补齐为 int 的整数倍,所以实际大小为 5 + 1 = 6
    char xm[8];// (6) + 8 = 14, 不是 float 的倍数,需要对齐,所以最终:(6) + 8 + (2) = 16
    float cj;// (16) + 4 = 20, 是 float 的倍数,不需要补齐,最终大小为 20
    }xc
    union的大小至少要容纳最大的bj[5]=1*5=5个字节(bh[2]=2*2=4个字节),同时要是联合体内变量类型最大值的整数倍,即2的整数倍,所以联合体的大小为6。
    sizeof计算联合体大小

你可能感兴趣的:(牛客)