C语言结构体位定义(位段)的实际作用深入分析

ops/2024/12/26 10:32:36/

1、结构体位段格式

struct struct_name {type [member_name] : width;
};
  • 一般定义结构体,成员都是int、char等类型,占用的空间大小是固定的
  • 在成员名称后用冒号来指定位宽,可以指定每个成员所占用空间,并且也不用受结构体成员起始地址对齐的限制

2、通过代码分析

2.1、不使用结构体位段

在这里插入图片描述

2.2、使用结构体位段

在这里插入图片描述

2.3、代码分析

  • 得到汇编代码的命令:
    • riscv64-unknown-elf-gcc test.c
    • riscv64-unknown-elf-objdump -dS ./a.out > test.dis
  • 2.1和2.2中的C语言代码除了结构体是否使用位段定义的区别外,并没有其他区别,但是通过反汇编文件可知,使用了结构体位段翻译出的汇编语句会更多
  • 使用了结构体位段,每个结构体所占空间会更少
  • 使用结构体位段,本质上就是降低C代码程序员的编程难度,将部分工作交给编译器完成
    • 比如上面的例子,使用结构体位段后,不同成员的位宽不一样,编译器在将C代码转换成汇编代码时,就会添加一些移位操作、与或操作,这些操作C代码程序员自己来完成也是可以实现的

3、结构体位段的优劣势

  • 使用位段的优势:
    • 结构体的大小比较小,成员排布紧密,定义结构体变量时所占空间小,可以节省内存
    • 使用位段,只是结构体定义有差别,对于访问结构体成员变量的方式并没有区别
  • 使用位段的劣势:
    • C语言代码虽然并没有区别,但是编译出的汇编代码会更多,编译出的elf/bin文件会更大
  • 位段合适的使用场景:
    • 设备的flash比较大,ram比较小:
      • 可以接受烧录文件大一些,但是希望变量占用的内存小一些
      • 相同功能,使用位段后要执行的汇编代码会更多,性能也会有下降
    • 用于协议头解析:
      • 在通信中,协议头解析是很常见的,有的协议头就是每个字段占几个bit,如果使用char、int等常规变量类型类定义结构体,无法和协议头的内容保持对齐
      • 按照协议头中各字段所占的bit位来定义结构体位段,可以很方便的解析出协议头中各字段的数值,C代码写起来简单易懂

http://www.ppmy.cn/ops/145099.html

相关文章

Django 模型字段类型详解

在 Django 中,模型是应用程序的核心部分之一。它们是 Python 对象,用于映射数据库表。每个模型都由一系列字段组成,这些字段代表数据库表中的列。Django 提供了丰富的字段类型,用于定义模型字段,以满足各种数据存储需求。 © ivwdcwso (ID: u012172506) 1. CharField Cha…

基于小程序宿舍报修系统的设计与实现ssm+论文源码调试讲解

第2章 开发环境与技术 基于微信小程序的宿舍报修系统的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对基于微信小程序的宿舍报修系统用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的,…

周期性边界条件、近邻列表和原子间作用势

文章目录 1.周期性边界条件1.什么是周期性边界条件(PBC)2.周期性边界条件基本特点3.最小镜像约定4.Python实现 2.势场的有限距离截断1.原子间相互作用力2.势场截断的理论基础3.势场截断方法 3.近邻列表构筑与更新1.近邻算法:VerletList法2.近邻算法:区间…

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1)导出数据到本地目录 2)导出到hdfs的目录下 3)直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

【C++】初识C++之C语言加入光荣的进化(上)

写在前面 本篇笔记作为C的开篇笔记,主要是讲解C关键字(C98)连带一点点(C11)的知识。掌握的C新语法新特性,当然C是兼容C的,我们学习C的那套在C中也是受用。 文章目录 写在前面一、命名空间域1.1、命名空间域的定义与使用1.2、命名空间域的细节…

基于3D-Speaker进行区分说话人项目搭建过程报错记录 | 通话录音说话人区分以及语音识别 | 声纹识别以及语音识别 | pyannote-audio

0. 研究背景 在外呼系统中,我们的后台管理系统通常要对电话录音的内容进行提取和分析。那么说到分析,我们就要对录音中的两个人的对话进行分离,然后分别分析,比如分析客户是否有合作的意愿,分析客服讲的话术是否合理&…

如何在 Ubuntu 22.04 上安装和使用 Composer

简介 如果你是一名 PHP 开发者,想要简化你的项目依赖管理,那么 Composer 是一个必不可少的工具。Composer 可以简化包管理,并允许你轻松地将外部库集成到你的项目中。 本教程将向你展示如何在 Ubuntu 22.04 操作系统上安装 Composer&#x…

Pytorch分布式训练

现在深度学习模型占用显存大,数据量也大,单张显卡上训练已经满足不了要求了,只有多GPU并行训练才能加快训练速度;并行训练又分为模型并行和数据并行两种。模型并行比较少用到,这里主要介绍数据并行,pytorch…