首页 > 试题广场 >

64位机上,一个结构体有三个成员,分别是char、int、s

[不定项选择题]
64位机上,一个结构体有三个成员,分别是char、int、short类型,三个成员位于结构体中不同位置时整个结构体的大小可能是()
  • 12
  • 7
  • 8
  • 16
不妨设该结构成员为char a, int b, short c。三个成员全排列,有6种位置情形。
另外,处理器为了提高处理性能,通常会对存取数据的起始地址提出要求(也正是人们常提及的边界对齐或字节对齐问题)。
①struct{char a; int b; short c;};   sizeof为12:char a填充了3字节,short c填充了2字节
struct{char a; short c; int b;};   sizeof为8:char a填充了1字节
struct{int b; char a; short c;};   sizeof为8:char a填充了1字节
struct{int b; short c; char a;};   sizeof为8:char a填充了1字节
struct{short c char aint b;};  sizeof为8:char a填充了1字节
struct{short c;  int bchar a;};  sizeof为12:char a填充了3字节,short c填充了2字节
以上仅个人见解,若有不当还请各位牛友指出,嘻嘻!
发表于 2021-02-27 16:42:00 回复(3)

内存对齐:假如第一个成员从0地址开始,储存每个成员的地址编号必须能被它的字节数整除,如果不能会填充空字节

内存补齐:如果结构体的总字节数,必须是它最大成员字节数的整数倍,如果不是,则在末尾填充空字节


发表于 2021-03-11 15:21:22 回复(0)
首先,结构体的总大小为结构体最宽基本类型成员的大小的整倍数。
这里最宽的是int型也就是4,那么根据整倍数就能排除b项。
然后存在两种情况,像盖楼房一样,每层的楼宽度要一样。一种是int“住一层”,short和char“住一层”少的一个字节填充字节补上,那么就是两层4*2=8;另一种三个成员“各住一层”,每层缺的字节都各自补上,也就是4*3=12。(我感觉这样好理解一些,有不对的欢迎指出)。
发表于 2022-04-24 10:43:51 回复(2)
64位机器不是8字节填充嘛
发表于 2022-03-23 14:34:33 回复(0)
字节对齐,这个题其实32位和64位没区别
编辑于 2022-05-05 20:09:51 回复(0)
结构体的总大小为结构体最宽基本类型成员的大小的整倍数
发表于 2023-08-07 23:28:02 回复(0)
字节对齐与字节补齐
发表于 2022-06-15 19:56:33 回复(0)
字节对齐
发表于 2021-02-26 11:33:13 回复(0)
如果填充倍数是八字节,就不可能是12,结构体变量所占空间的大小是对齐参数大小的整数倍.
发表于 2022-08-01 15:26:16 回复(1)
大概懂了。我理解是: 光用int 占8个 先char 再int,他俩中间隔着3个,加起来12个
发表于 2022-07-15 20:00:57 回复(0)
总把64位int当8
发表于 2022-04-08 09:11:34 回复(0)
发表于 2021-09-07 09:40:27 回复(0)

考点:内存对齐
PS:其实...如果,我将默认内存对齐设置为1,那么7也是可能的

#include<bits/stdc++.h>
using namespace std;
//修改默认内存对齐数为1,而不是64位中的8
#pragma pack(1)
struct demo
{  
    char a;
    short b;
    int c;
};

int main()
{
    demo tt;
    cout << "sizeof(tt)=" << sizeof(tt) << endl;
    return 0;
}
//Linux下64位g++获得结果是1

或许题目中想问的是:在64位机器上,默认内存对齐方式下,有可能的是『因为笔者修改就能出现其他结果』

发表于 2021-03-14 17:01:07 回复(0)
我在64位电脑上测试可以有7呀?
#include <iostream>
using namespace std;

#pragma push()
#pragma pack(1)
struct Test2
{  
    char a;
    short b;
    int c;
};
#pragma pop()

int main(){
    Test2 t2;
    cout << "t2 " << sizeof(t2) << endl;
    return 0;
}


发表于 2019-08-29 11:48:42 回复(1)