首页 > 试题广场 >

32位机器上定义如下结构体,​请问sizeof(xx)的大小

[单选题]
32位机器上定义如下结构体:
struct xx {
    long long _x1;
    char _x2;
    int _x3;
    char _x4[2];
    static int _x5;
};
int xx::_x5;
请问sizeof(xx)的大小是()

  • 19
  • 20
  • 15
  • 24
推荐
D    
    说下我的观点
1-8的地址分给了_x1 ,
9分给了_x2,
13-16分给了_x3,  int要按4对齐所以10-13的空间其实是浪费了
17-18分给了_x4,
_x5不占用空类间, 
最后本身是需要按照8对其
所以19-24也被占用了
编辑于 2016-01-12 13:04:44 回复(13)
多项选择搞什么呢?!还以为有什么新知识不知道orz
发表于 2016-08-18 16:28:53 回复(1)
D
要注意自身是和8对齐的
发表于 2015-01-27 11:20:16 回复(0)
首先_x5是静态变量可以不用管它,其次是要考虑字节对齐的问题。对于结构体中没有含有结构体变量的情况,有两条原则:1)结构体变量中成员的偏移量必须是成员大小的整数倍;2)结构体的最终大小必须是结构体最大简单类型的整数倍。x1的偏移量是0,长度是8,符合;x2的偏移量是8,长度是1,符合;x3的偏移量是9,长度是4,不符合,需要在x2之后填充3字节使得x3的偏移量达到12;x4的偏移量是16,长度是2,符合;此时总长度为(8)+(1+3)+(4)+(2)=18,而最大简单类型为long long长度为8,因此需要在x4之后再填充6字节,使得总长度达到24可被8整除。因此sizeof(xx)的结果为24。
发表于 2016-06-02 21:36:16 回复(5)
结构体总的大小要被最大的整除,本体中long long 为8字节,所以整体大小为8的倍数。 另外,为什么不是16,因为每种类型变量的首地址要是自己类型的字节数整除,所以char后面要空着3个字节,之后才是int型变量。 所以一共24字节。
发表于 2016-07-18 22:24:55 回复(0)
答案错误  选B的   4字节对齐  8+4+4+4=20   静态不考虑
发表于 2017-02-23 10:48:07 回复(1)
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值(或默认值)和这个数据成员类型长度中,比较小的那个进行。在上一个对齐后的地方开始寻找能被当前对齐数值整除的地址.
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐.主要体现在,最后一个元素对齐后,后面是否填补空字节,如果填补,填补多少.对齐将按照#pragma pack指定的数值(或默认值)和结构(或联合)最大数据成员类型长度中,比较小的那个进行。
这一题默认是8字节对齐,就是24,如果是4字节对齐就是20

此结构体的大小是:24

解析如下:

首先 _x5 是静态变量不占用空间,其次要考虑字节对齐问题。

对于结构体中没有含有结构体变量的情况,有两条原则:

  1.       结构体变量中成员的偏移量必须是成员大小的整数倍;    

    结构体的有效对齐值的确定:

    1)当未明确指定时,以结构体中最长的成员的长度为其有效值

    2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。

    3)当用 __attribute__ ((__packed__)) 指定长度时,强制按照此值为结构体的有效对齐值
    题目没有明确指定是什么方式,所以就默认第一种,按8的倍数来
  2.       结构体的最终大小必须是结构体最大简单类型的整数倍。

x1 的偏移量是0,长度是8,符合;

x2 的偏移量是8,长度是1,符合;

x3 的偏移量是9,长度是4,不符合,需要在x2 之后填充3字节使得x3 的偏移量达到12;

x4 的偏移量是16,长度是2,符合;

此时总长为(8)+(1+3)+(4)+(2)= 18;

而最大简单类型为long long长度为8,因此需要在x4 之后再填充6字节,使总长达到24可以被8整除。所以最后总长为24.



结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用__attribute__ ((__packed__))指定长度时,强制按照此值为结构体的有效对齐值
发表于 2020-08-04 21:26:12 回复(0)
首先_x5是静态变量可以不用管它
其次是要考虑字节对齐的问题。
对于结构体中没有含有结构体变量的情况,有两条原则:
1)结构体变量中成员的偏移量必须是成员大小的整数倍;
2)结构体的最终大小必须是结构体最大简单类型的整数倍。
x1的偏移量是0,长度是8,符合;
x2的偏移量是8,长度是1,符合;
x3的偏移量是9,长度是4,不符合,需要在x2之后填充3字节使得x3的偏移量达到12;
x4的偏移量是16,长度是2,符合;此时总长度为(8)+(1+3)+(4)+(2)=18,而最大简单类型为long long长度为8,因此需要在x4之后再填充6字节,使得总长度达到24可被8整除。因此sizeof(xx)的结果为24。
发表于 2021-06-18 14:45:36 回复(0)

发表于 2017-10-13 14:07:47 回复(0)

结构体的有效对齐值的确定:

1)当未明确指定时,以结构体中最长的成员的长度为其有效值

2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。

3)当用 __attribute__ ((__packed__)) 指定长度时,强制按照此值为结构体的有效对齐值
题目没有明确指定是什么方式,所以就默认第一种,按8的倍数来
发表于 2017-06-14 09:36:11 回复(0)
个人觉得要考虑系统设置的对齐值,如果对齐值为4(#pragram pack(4)),那结果就应该是20啊!
发表于 2017-03-01 11:29:07 回复(0)
32位机器:
long long _x1;       8字节               8
char _x2;       1字节                1+3(考虑内存对齐,下一个占4字节,此处应加3,保证下一个从4的倍数内存开始)
int _x3;       4字节                4
char _x4[2];       2*1字节             2 +2 (保证内存总数是8的倍数,加6)
static int _x5;       在静态区,不在栈中,不考虑
总共8+8+4+4=24
编辑于 2016-09-02 11:48:40 回复(4)
不定项选择:BD,根据内存对齐在linux是20,在win是24
发表于 2018-11-19 07:11:08 回复(0)
这个博客把这个问题解释的很详细很到位http://blog.csdn.net/andy572633/article/details/7213465
发表于 2017-04-11 10:21:13 回复(1)
d
静态成员不占用类空间
发表于 2015-04-07 15:09:15 回复(0)
题目不明确,答案不精确。 根据题目能够确定的信息有: 1.long long 占8字节 2._x5在静态区,不占用结构体空间。 依据: 结构体的有效对齐值为 min{所有成员中有效对齐值的最大值,pack指定的对齐值} = min{8,pack(n)}. 结构体大小为结构体有效对齐值的整数倍。 不考虑对齐时,pack(1)所有成员之间都没有填充字符时长度为,8+1+4+2 = 15. pack(4) 时各成员相对结构体首地址偏移量为0,8,9,16,18最后填充2字节,为20. pack(8) 时各成员相对结构体首地址偏移量为0,8,9,16,18最后填充6字节,为24 。 pack(2) 时各成员相对结构体首地址偏移量为0,8,9,14,16,为16. 关键问题是不同的操作系统下不同的编译器默认的pack指定对齐值不同。 一般老式编译器为1.gcc为4. visual c++部分版本为8.默认为2的新编译器不多,老式编译器有。 但在最新的支持C11的编译器种,大多数默认为4.
编辑于 2019-05-23 01:29:26 回复(0)
结构体:1 每个成员变量的首地址,要被类型的字节数整除(否则要在扩展成员变量所占的字节数) 2 最终的字节数要被最大类型的成员变量整除
发表于 2018-11-18 21:26:56 回复(0)

在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:

      (1)结构体成员变量的偏移量必须是成员变量大小的整数倍(0被认为是任何数的整数倍) 

      (2)结构体整体大小必须是各个成员变量大小的整数倍,也即所有成员大小的公倍数
所以分析:变量        类型        大小    偏移量
                  _x1        long long  8          0
                  _x2            char       1          8
                  _x3            int          4          9+3=12
                  _x4           2*char     2+6      16
所以sizeof()结果是最后一个变量的偏移量+大小=16+8=24
发表于 2016-07-30 13:29:00 回复(0)
在32位操作系统中,对齐字节== min(结构体中最宽数据类型,4字节)。
答案是20,使用#pragma pack(4)模拟对齐字节是4字节。

模拟8字节的情况,结果是24

发表于 2023-11-28 19:53:40 回复(0)
8字节对齐,然后每种类型变量的首地址要被自己类型的字节数整除,x3的首地址不能为9,只能为12,往下推,8的整数倍只能是24
发表于 2020-04-27 21:50:22 回复(0)
麻痹,那你把这个题设置成多选干嘛,我以为又有些破机器不考虑占位问题呢
发表于 2019-03-03 10:58:04 回复(0)