首页 > 试题广场 >

What’s the output of&n...

[不定项选择题]
What’s the output of below code on a 64-bit system?(单选)

#include <iostream>
using namespace std;

struct data {
int type;

struct {
    unsigned int a:1;
    unsigned int b:1;
    unsigned int c:4;
    unsigned int d:4;
    unsigned int e:4;
    unsigned int f:4;
    unsigned int g:4;
    unsigned int h:8;
    unsigned int i:8;
} flags;

struct {
    unsigned int a:1;
    unsigned int b:1;
} flagsEx;
};

int main() {
    data temp;
    int a = sizeof(data);
    int b = sizeof(temp);

    data *pTemp = new data();
    int c = sizeof(pTemp);
    delete pTemp;
    pTemp = NULL;

    cout << a << ", " << b << ", " << c << endl;

    return 0;
}
  • 16, 16, 8
  • 48, 48, 8
  • 48, 16, 8
  • 16, 4, 4
 unsigned int a:1;不是给a赋初值,在内存中存取数据的最小单位一般是字节,但有时存储一个数据不必用一个字节。这是一种位域的结构体,这个结构里a占用的是一个字节中的1位,b也占用1位.所以这里的a和b的取值只能是0和1。因为它们都是用1位来表示的。使用位域可以节省很多的内存空间。
并且存储器会按照其定义类型预留存储bit位空间, 
struct {
       unsigned int a:1;
       unsigned int b:1;
       unsigned int c:4;
       unsigned int d:4;
       unsigned int e:4;
       unsigned int f:4;
       unsigned int g:4;
       unsigned int h:8;
       unsigned int i:8;
   } flags;
共占用38个bit,但一个unsigned int占四个字节共32个bit,多出的6个bit占四个字节,多出来的是预留空间;
同理   struct {
       unsigned int a:1;
       unsigned int b:1;
   } flagsEx;
也占四个字节;
sizeof针对类型,a,b输出的都是struct data 的大小,所以a=b=4+8+4=16;
c输出的是指针的大小,所以c=64/8=8;

/**********************************************************************/
关于预留空间的补充:预留空间是针对最大bit类型的,如
仅改变 flagsEx
struct {
       unsigned char a:1;
       unsigned int b:1;
   } flagsEx;
 flagsEx任然占用4个字节;a,b,c结果不变
仅改变 flagsEx
struct {
       unsigned long a:1;
       unsigned int b:1;
   } flagsEx;
flagsEx占用8个字节;但会改变flags和 int type的最小占用单位变为8个字节
结果a=b=24;但是sizeof(type)任然等于4;

仅将int type 改为long type结果结果a=b=24;但是sizeof(flagsEx)任然等于4;
也就是说flagsEx 、flags、type中最大类型决定了data最小存储单位,存储位数不够则增加一个最小存储单位
编辑于 2020-10-05 11:00:11 回复(3)
type是int类型4个字节
a:1是位域,可以理解为占1个bit。那么第一个struct一共是38bit,32个bit是4字节,所以38是8字节。
同理第二个struct是4个字节。
所以a,b为16字节
而c是在64bit的系统中的,所以指针大小为8字节
发表于 2019-03-01 19:15:02 回复(3)
不是说多选题吗……
发表于 2023-03-04 15:06:02 回复(0)
int type类型占4个字节
flags占1+1+4+4+4+4+4+8+8=38bit,由于一个unsigned int占4个字节32bit,38>32,内存对齐后为8个字节。
flagsEX占1+1=2bit,内存对齐后为4字节(unsigned int所占字节数)
所以 a:4+8+4=16;
b=a=16;
c为指针,在64位系统中指针占8个字节,所以c=8;
发表于 2022-08-03 17:00:34 回复(1)
自然对齐 指的是将对应变量类型存入对应地址值的内存空间,即数据要根据其数据类型存放到以其数据类型为倍数的地址处。 例如char类型占1个字节空间,1的倍数是所有数,因此可以放置在任何允许地址处,而int类型占4个字节空间,以4为倍数的地址就有0,4,8等。编译器会优先按照自然对齐进行数据地址分配。 规则对齐 以结构体为例就是在自然对齐后,编译器将对自然对齐产生的空隙内存填充无效数据,且填充后结构体占内存空间为结构体内占内存空间最大的数据类型成员变量的整数倍。
发表于 2022-09-21 00:09:50 回复(0)
内存对齐是以占用最多内存的类型为基准的 即unsigned int 4字节 即使 38 bit > 32bit 所以占用8字节
发表于 2022-04-15 14:42:17 回复(0)
一眼丁真,鉴定为屏蔽此题
发表于 2023-10-31 21:08:22 回复(0)
32位 结构体内 char a int b:2 这个结构体几个字节
发表于 2023-10-08 13:15:24 回复(0)