2- 位段式结构体

news2025/1/2 12:53:02

文章目录

  • 1 结构体内存对齐
  • 2 位段式结构体
    • 2.1 格式
    • 2.2 成员类型
    • 2.3 空间开辟
    • 2.4 示例
      • 2.4.1 示例1
      • 2.4.2 示例2

1 结构体内存对齐

  1. 首成员对齐规则
    • 结构体的第一个成员从偏移量为0的地址处开始存放,即与结构体的首地址对齐。
  2. 其他成员对齐规则
    • 其他成员变量的存放地址必须对齐到其对齐数的整数倍;
    • 对齐数的定义为:该成员变量自身大小与编译器默认对齐数的较小值:
      • 在Visual Studio中,默认对齐数为8;
      • 如果编译器没有默认对齐数,则成员变量的大小即为它的对齐数,如GCC。
  3. 结构体总大小
    • 结构体的总大小必须是其所有成员中最大对齐数的整数倍。如果不足,编译器会在末尾填充字节以满足对齐要求。
  4. 嵌套结构体的对齐规则
    • 如果结构体中嵌套了结构体,则嵌套的结构体需要对齐到其自身最大对齐数的整数倍处;
    • 结构体总大小必须是其所有成员(含嵌套结构体成员)中最大对齐数的整数倍。

另外:

  1. 计算成员偏移量
    • offsetof宏可以用来计算结构体成员相对于起始位置的偏移量。
  2. 修改默认对齐数
    • #pragma pack(n)可以将默认对齐数设置为n;
    • #pragma pack()可以取消默认对齐数设置,恢复到最初的默认值。

2 位段式结构体

2.1 格式

位段式结构体的定义与普通结构体类似,但在成员声明时需要指定所占的位数。格式如下:

struct 结构体名 {
    类型 成员名 : 位数;
    // 其他成员...
};

2.2 成员类型

位段的成员类型必须是整数类型,如下图所示:

分类类型说明
基本型int有符号整型,通常是32位
基本型unsigned int无符号整型,通常是32位
基本型char有符号字符型,8位
基本型unsigned char无符号字符型,8位
基本型_Bool布尔型,C99引入,通常为1位
扩展型short有符号短整型,通常是16位
扩展型unsigned short无符号短整型,通常是16位
扩展型long有符号长整型,通常是32位或64位
扩展型unsigned long无符号长整型,通常是32位或64位
扩展型long long有符号长长整型,通常是64位
扩展型unsigned long long无符号长长整型,通常是64位
扩展型enum枚举类型,底层通常是int

2.3 空间开辟

位段的空间开辟规则可以归纳为以下几点:

  1. 新空间的开辟要满足基本的结构体内存对齐规则(参考“1 结构体内存对齐”);
  2. 新空间的开辟要基于成员类型(如char类型1字节、short类型2字节、int类型4字节);
  3. 类型相同的位段可以共享空间,类型不同的位段不能共享空间
  4. 如果当前开辟空间的剩余位数不足以容纳下一个位段,则重新开辟一个空间。

2.4 示例

2.4.1 示例1

类型相同的位段共享空间,示例代码如下所示:

typedef struct {
   unsigned int a : 10; // 10位
   unsigned int b : 8;  // 8位
   unsigned int c : 4;  // 4位
} bitField1;

int main()
{
   //
   printf("Size of bitField1 : %zu bytes.\n", sizeof(bitField1));
   //
   return 0;
}

运行结果如下图所示:

在这里插入图片描述
代码及运行结果分析如下:

  1. 开辟4字节空间,成员a占10个比特位,还剩下22个比特位;
  2. 成员b和成员a类型相同,可与a共享已开辟的空间,占用剩余22个比特位中的8个比特位,还剩下14个比特位;
  3. 成员c和成员a、b类型相同,可与a、b共享已开辟的空间,占用剩余14个比特位中的4个比特位,还剩下10个比特位。

2.4.2 示例2

类型不同的位段共享空间,示例代码如下所示:

typedef struct {
   unsigned int a : 20;   // 20位,类型为 unsigned int
   unsigned short b : 10; // 10位,类型为 unsigned short
} bitField2;

int main()
{
   //
   printf("Size of bitField2 : %zu bytes.\n", sizeof(bitField2));
   //
   return 0;
}

运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析如下:

  1. 从偏移量0处开辟4字节空间,成员a占20个比特位,还剩下12个比特位;
  2. 注意:尽管当前已开辟的空间的剩余比特位(12个)足以容纳成员b(10个比特位),但是,因为成员b与成员a类型不同,不可共享已开辟的空间,需要重新开辟空间;从偏移量4处开辟2字节空间,成员b占10个比特位,还剩下6个比特位;
  3. 另外,结构体总大小必须是其所有成员中最大对齐数的整数倍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Milvus×EasyAi:如何用java从零搭建人脸识别应用

如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括: EasyAi:人脸特征向量提取Milvus:向量数据库用于高效存储和检索数据。 01. EasyAi:…

AWS K8s 部署架构

Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…

[Pro Git#2] 分支管理 | branch fix_bug , feature | 处理合并冲突

目录 一、Issue模板文件 二、Pull Requests模板文件 分支管理 1. 理解分支 2. 创建与管理分支 1. 切换分支与提交历史 2. 合并分支 3. 删除分支 4. 解决合并冲突 6. 查看分支合并情况 快速创建并切换分支 分支管理策略 分支合并模式 分支管理原则 日常开发环境 …

Acwing 基础算法课 数学知识 筛法求欧拉函数

【G09 筛法求欧拉函数】https://www.bilibili.com/video/BV1VP411p7Bs?vd_source57dbd16b8c7c2ad258cccce5966c5be8 闫总真是把听者当数学系转cs的来讲,菜逼完全听不懂,只能其他地再搜 欧拉函数 φ ( n ) \varphi(n) φ(n):1~n中与n互质的数…

SpringCloudAlibaba技术栈-Higress

1、什么是Higress? 云原生网关,干啥的?用通俗易懂的话来说,微服务架构下Higress 就像是一个智能的“交通警察”,它站在你的网络世界里,负责指挥和调度所有进出的“车辆”(也就是数据流量)。它的…

# 光速上手 - JPA 原生 sql DTO 投影

前言 使用 JPA 时,我们一般通过 Entity 进行实体类映射,从数据库中查询出对象。然而,在实际开发中,有时需要自定义查询结果并将其直接映射到 DTO,而不是实体类。这种需求可以通过 JPA 原生 SQL 查询和 DTO 投影 来实现…

智能故障诊断和寿命预测期刊推荐

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

MTK抓log方法log机制以及如何抓取log

目录 离线log抓取: adb命令打开mtklog的方法 : 实时log抓取: 设置log等级和打开平台log: 实时抓取,两种方式: Kernel Log: LOG 优先级 logcat 离线log抓取: 1.手机先进入开发者模式 2.进入拨号页面…

人工智能与云计算的结合:如何释放数据的无限潜力?

引言:数据时代的契机 在当今数字化社会,数据已成为推动经济与技术发展的核心资源,被誉为“21世纪的石油”。从个人消费行为到企业运营决策,再到城市管理与国家治理,每个环节都在生成和积累海量数据。然而,数…

如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程

简介 在本教程中,我们将学习如何在 Ubuntu 22.04 服务器上安装和配置 Varnish HTTP。 Varnish 是一款高性能的 HTTP 加速器,旨在提高内容密集型动态网站的速度。它通过将网页缓存在内存中来工作,从而减少 Web 服务器的负载,并显…

AI辅助编码提高病案首页主要诊断编码正确率数据优化方法(2025增量优化版附python源代码)

一、引言 1.1 研究背景与意义 在医疗信息化进程中,病案首页作为病历信息的核心浓缩,承载着疾病分类、医疗统计、医保结算等关键任务,其主要诊断编码的准确性至关重要。准确的编码不仅是医疗质量评估、科研数据分析的基石,更是合理分配医疗资源、保障医保精准支付的关键依…

CSES-1135 Distance Queries

题目传送门https://vjudge.net/problem/CSES-1135#authorGPT_zh 解题思路 题目让我们求树上两个点的距离。 那么就可以转化为两点到其 LCA 的距离之和。 代码 #include<bits/stdc.h> using namespace std;int n,q; vector<int> g[200001]; int dis[200001],dep…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

001__VMware软件和ubuntu系统安装(镜像)

[ 基本难度系数 ]:★☆☆☆☆ 一、Vmware软件和Ubuntu系统说明&#xff1a; a、Vmware软件的说明&#xff1a; 官网&#xff1a; 历史版本&#xff1a; 如何下载&#xff1f; b、Ubuntu系统的说明&#xff1a; 4、linux系统的其他版本&#xff1a;红旗(redhat)、dibian、cent…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…