首页 > 试题广场 >

class A { int a;&...

[单选题]
class A {
    int a;
    short b;
    int c;
    char d;
};
class B {
    double a;
    short b;
    int c;
    char d;
};
在32位机器上用gcc编译以上代码,求sizeof(A),sizeof(B)分别是()
  • 12 16
  • 12 12
  • 16 24
  • 16 20
讲一下自己的理解吧,字节对齐的题很常见的。
原则有3条(楼上已经说了),讲一下自己的理解:
1. 结构体变量的首地址 必须 是内部最宽数据类型的倍数(虽然和做题没什么关系)
2. 按顺序一个变量一个变量看,要求current变量的首地址 必须是自己大小的倍数。
3. 到了最后一个变量,要求整个结构体的大小的最宽数据类型的倍数。

那么看一下 这道 题:
A:  int  a      (4个字节)                                                  4
short b     (2个字节,起始地址4是2的倍数,不补)        4+2
int  c         (4个字节,4+2不是4的倍数,被2个 )        4+2+2(补)+4
char d        (1个字节,4+2+2+4是1的倍数,不补)    4+2+2(补)+4 +1
最后补3个字节,让整体大小为4的倍数      4+2+2(补)+4+1+3(补) =16

B:  double a      (8个字节)                                                  8
short b     (2个字节,起始地址8是2的倍数,不补)        8+2
int  c         (4个字节,8+2不是4的倍数,被2个 )        8+2+2(补)+4
char d        (1个字节,8+2+2+4是1的倍数,不补)    8+2+2(补)+4 +1
最后补7个字节,让整体大小为8的倍数      8+2+2(补)+4+1+7(补) =24


编辑于 2019-09-17 10:13:40 回复(10)
A  ----->     △△△△||△△==||△△△△||△===
B ----->    △△△△△△△△||△△==(short)△△△△(int)||△=======
其中△为数据存储,=为填充
发表于 2019-02-26 12:35:32 回复(7)
链接:https://www.nowcoder.com/questionTerminal/4bcbe5bbcb564d238d2f3d6e7dbb83ea?orderByHotValue=0&mutiTagIds=641_134&page=8&onlyReference=false
来源:牛客网
按照下面3个条件来计算:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
发表于 2019-02-24 14:28:53 回复(1)
自己通过#pragma pack(4)模拟32位字节对齐方案。最后的sizeof(B)应该是4的倍数而不是8的倍数,所以结果是20,而不是24。
选择D
发表于 2020-10-04 10:48:32 回复(1)
1.默认四字节对齐:16,20 2.默认八字节对齐:16,24 一般32位都是默认四字节对齐。
发表于 2022-12-09 10:21:27 回复(0)
讲一下自己的理解吧,字节对齐的题很常见的。
原则有3条(楼上已经说了),讲一下自己的理解:
1. 结构体变量的首地址 必须 是内部最宽数据类型的倍数(虽然和做题没什么关系)
2. 按顺序一个变量一个变量看,要求current变量的首地址 必须是自己大小的倍数。
3. 到了最后一个变量,要求整个结构体的大小的最宽数据类型的倍数。

那么看一下 这道 题:
A:  int  a      (4个字节)                                                  4
short b     (2个字节,起始地址4是2的倍数,不补)        4+2
int  c         (4个字节,4+2不是4的倍数,被2个 )        4+2+2(补)+4
char d        (1个字节,4+2+2+4是1的倍数,不补)    4+2+2(补)+4 +1
最后补3个字节,让整体大小为4的倍数      4+2+2(补)+4+1+3(补) =16

B:  double a      (8个字节)                                                  8
short b     (2个字节,起始地址8是2的倍数,不补)        8+2
int  c         (4个字节,8+2不是4的倍数,被2个 )        8+2+2(补)+4
char d        (1个字节,8+2+2+4是1的倍数,不补)    8+2+2(补)+4 +1
最后补7个字节,让整体大小为8的倍数      8+2+2(补)+4+1+7(补) =24
发表于 2022-06-06 10:21:18 回复(0)
这道题本身是有问题的,gcc 编译的是C语言文件,g++编译的是c/c++文件。使用g++编译32位程序,需要加上-m32参数。
A类中,是四字节对齐: 4 * 4 = 16;  B类中,a占8个字节,b和c合占8个字节,d占4个字节,合计是20个字节。 所以答案应该是 16, 20;

若是不加-m32参数,那么默认是64位编译,8字节对齐,答案是: 16, 24。
编辑于 2021-08-09 09:17:25 回复(0)
整个结构体的一定要是最长那个位的整数倍对齐。所以class B是 8+(2+4)+(1),有括号的都补成8位,所以,8+8+8=24
发表于 2021-03-22 23:13:52 回复(0)
应该是16和20吧,32位对齐模数不是4吗????
发表于 2022-04-26 10:49:51 回复(0)

发表于 2022-08-04 13:42:37 回复(0)
我觉得,因为是g++环境下编译,编译成64位了
发表于 2023-10-04 13:44:23 回复(1)
用#paragam pack(4) 模拟32位  sizeof(struct B) = 20
注释掉#paragam pack(4)     sizeof(struct B) = 24
在64位操作系统中,B的分析

编辑于 2023-08-01 20:12:08 回复(0)
答案错了吧,32位机器是4字节,应该选d
发表于 2024-04-17 14:37:52 回复(0)
。。
发表于 2022-08-30 20:14:59 回复(0)
32位对齐模数是4B吧,B应该是20啊
发表于 2022-06-23 22:34:32 回复(1)
32位机器是指一次运算只能取32位,而存储器里可以一行存64位,即一行存一个double。
发表于 2021-03-19 16:12:09 回复(0)