您的位置:首页 > 新闻 > 热点要闻 > 腾讯云备案网站建设方案书_去成都旅游攻略怎么做_域名怎么查_seo黑帽有哪些技术

腾讯云备案网站建设方案书_去成都旅游攻略怎么做_域名怎么查_seo黑帽有哪些技术

2024/10/6 6:05:33 来源:https://blog.csdn.net/weixin_70620792/article/details/142714101  浏览:    关键词:腾讯云备案网站建设方案书_去成都旅游攻略怎么做_域名怎么查_seo黑帽有哪些技术
腾讯云备案网站建设方案书_去成都旅游攻略怎么做_域名怎么查_seo黑帽有哪些技术

文章目录

  • 1. 结构体类型的声明和初始化
  • 2. 结构体自引用
  • 3. 结构体内存对齐
    • 3.1 结构体内存对齐规则
    • 3.2 修改默认对齐数
  • 4. 结构体传参
  • 4. 结构体实现位段
  • 5. 位段使用的注意事项

1. 结构体类型的声明和初始化

  结构体在使用之前都要对其类型进行声明,关键字是struct,就像我们经常使用printf函数一样,包含stdio.h头文件也是告诉编译器,我们要使用该头文件里面的函数,自定义函数也是如此,需要先声明再使用
在这里插入图片描述


  • 当然也可能碰见结构体在声明结构体时,会出现不完全声明
  • 这种就是结构体的匿名声明

在这里插入图片描述

2. 结构体自引用

  结构体里能否放入一个同类型的结构体呢?
在这里插入图片描述


  • 那么如何实现结构体自引用呢?

在这里插入图片描述


3. 结构体内存对齐

3.1 结构体内存对齐规则

  我们先看一段代码
在这里插入图片描述

  原因呢,与结构体内存对齐有关

  • 结构体内存对齐规则
  • 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处
  • 其他成员变量要对齐到对齐数的整数倍地址处
  • 对齐数 = 编译器默认的一个对齐数和该成员变量自身大小的较小值
  • VS 中对齐数是 8
  • Linux中 gcc 没有默认对齐数,对齐数是成员本身大小
  • 结构体总大小为最大对齐数(包括第一个成员的对齐数,所有成员中最大的对齐数)的整数倍

在这里插入图片描述


在这里插入图片描述


  • 结构体嵌套内存对齐的规则
  • 如果结构体发生嵌套使用,那么嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的总大小就是最大对齐数(含嵌套结构体)的整数倍

在这里插入图片描述


在这里插入图片描述


  • 通过以上例子我们可以看出,结构体在存储时会浪费一部分内存
  • 为了避免浪费过多的内存,尽量让占用内存空间小的成员集中在一起
//内存浪费过多
struct S2
{char c1;int n;char c2;
};
//内存浪费过少
struct S1
{char c1;char c2;int n;
};

3.2 修改默认对齐数

  • 同时我们也可以修改默认的对齐数
  • # pragma 这个预处理指令,可修改编译器的默认对齐数

在这里插入图片描述


在这里插入图片描述


4. 结构体传参

  • 结构体传参有两种形式,一种是结构体变量传参,一种是结构体变量地址传参

在这里插入图片描述


在这里插入图片描述


  • 结构体变量在传参时,形参会创建一个跟实参大小相同的结构体,对于占据较大内存空间的结构体来说有点浪费空间,而结构体变量地址传参时,它最多接收4/8个字节,因此大大缩小了占用内存
  • 结构体传参尽量使用传址的形式

4. 结构体实现位段

  • 位段的定义
  • 位段的成员是int、unsigned int、signed int或char等类型
  • 位段成员名后边有一个冒号和一个数字

在这里插入图片描述


  • 那么位段成员冒号后面的数字是什么意思呢?
  • 数字表示该变量占多少个bit位

在这里插入图片描述


在这里插入图片描述


  对比以上可知,位段在使用时比结构体节省空间,尽管位段在使用时可以大大节省空间,但由于它存在跨平台的问题,不同的平台位段的大小不确定,位段成员的内存分配是从右开始还是从左开始未定义,内存是否存在舍弃存储的现象等等,因此使用时需特别注意

5. 位段使用的注意事项

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com