结构体大小及位域
  C

结构体大小及位域

 次点击
26 分钟阅读

结构体的大小

sizeof A = 12 sizeof B = 6 sizeof C = 24

字节对齐

含义

字节对齐主要是针对结构体而言的,通常编译器会自动对其成员变量进行对齐,以提高数据存取的效率

作用

  • 提高访问速度:现代计算机体系结构中,CPU 访问内存时,如果数据能够按照一定的规则对齐,那么访问速度会更快。

  • 简化硬件设计:对齐的数据可以让处理器更容易处理

1、有效对齐取自身和默认的最小值
2、起始地址必须是有效对齐的整数倍
3、最终的对齐方式,看有效对齐的最大值

struct A
{
    char a;
    int b;
    char c;
    char d;
};

自身对齐

默认对齐

有效对齐

起始地址

a

1

8

1

0

b

4

8

4

4、5、6、7

c

1

8

1

8

d

1

8

1

9

结论

a占用0,补3字节,共4个字节;b占用4 5 6 7共四字节;
c占用8共一个字节,c占用9共一个字节,补2字节。综上,共占用12字节

struct B
{
    char a;
    short b;
    char c;
    char d;
};

自身对齐

默认对齐

有效对齐

起始地址

a

1

8

1

0

b

2

8

2

2、3

c

1

8

1

4

d

1

8

1

5

结论

最终对齐,是2字节;所以a需要补1字节,最终得6

struct C
{
    char a;
    double b;
    char c;
    char d;
};

自身对齐

默认对齐

有效对齐

起始地址

a

1

8

1

0

b

8

8

8

8、9、10、11、12、13、14、15

c

1

8

1

16

d

1

8

1

17

结论

最终对齐是8字节,a补7位,cd一共需要补6位,综上,共占用24字节

结构体大小的计算方法

  • 自身对齐和默认对齐取最小值是有效对齐

  • 存放地址的首地址,需是有效对齐的最小倍数

位域

定义

所谓的“位域”是把一个字节中的二进制位分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

位域的一般形式:

struct 位域结构体名
{
位域列表;
};

其中位域列表的形式为:
类型说明符  位域名:位域长度

位域变量的说明

  • struct 位域结构体名 变量名

  • struct 位域结构体名 变量名 = {成员1值,成员2值..}

  • 定义位域结构体时顺便创建变量

© 本文著作权归作者所有,未经许可不得转载使用。