C语言复习—结构体的内存对齐规则、位段的内存分配、枚举的优点

柔光的暖阳◎ 2022-05-19 14:24 223阅读 0赞

结构体的内存对齐规则、位段的内存分配、枚举的优点

结构体

如何对齐

  1. 将结构体第一个成员放在与结构体偏移量为0的地址处;
  2. 其他成员要对齐到对齐数的整数倍处,对齐数 = 编译器默认的一个数字 与 该成员大小的较小值。
  3. 结构体的总大小为对最大齐数的整数倍。

对齐原因

  1. 栈上存储的数据内存尽可能的在自然边界上对齐。
  2. 为了访问未对齐的内存,处理器需要做两次访问,而访问对其的内存只需要访问一次。
  3. 这是一种以空间换时间的做法。为了节省空间,我们可以把内存空间占用小的成员定义在一起。

结构体传参

  1. 在结构体传参时:struct S s = {1,2,3};test(&s)test(s)×
  2. 我们应该传地址,不能传结构体,因为函数传参时,参数是要压栈的,如果传结构体,压栈开销比较大,会影响性能。

位段的内存分配

位段(位域)是一个或多个位的字段,不同长度的字段存储在一个或多个其所声明类型的变量中。
例如:

  1. struct st1
  2. {
  3. unsigned char a:7; /*字段a占用了一个字节的7个bit*/
  4. unsigned char b:2; /*字段b占用了2个bit*/
  5. unsigned char c:7; /*字段c占用了7个bit*/
  6. }s1;
  7. sizeof(s1)等于3
  8. struct st2
  9. {
  10. unsigned int a:31;
  11. unsigned int b:2;/*前一个整型变量只剩下1个bit,容不下2个bit,所以只能存放在下一个整型变量*/
  12. unsigned int c:31;
  13. }s2;
  14. sizeof(s2) = 3*sizeof(int) = 12

一个字节8个bit位,根据声明类型的大小,来判断结构体位域的大小

我们可以使用#define,为什么要用枚举?

枚举的优点

  1. 增加了代码的可读性与可维护性,
  2. 跟#define相比,枚举具有类型检查,更加安全严谨
  3. 便于调试
  4. 使用方便,一次可以定义多个常量
  5. 将其封装起来可以防止命名污染

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言:--域和内存对齐

    这节写点什么,就写位域和内存对齐吧。 位域 位域是指信息在保存时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位。为了节省空间,C语言提供了一种数据结构