
位段、枚举、联合
整型的符号性质不确定(有符号与无符号可能不同)。 平台间的最大字节数差异可能导致移植失败。 存储方向和位数分配方式不统一。 存储过程中可能存在内存碎片问题。 位段成员无需内存对齐。 位段是一种空间优化的压缩方案,仅考虑存储空间,不考虑操作效率。
提高代码可读性和维护性。 强类型检查,避免常量赋值错误。 命名空间隔离,避免命名冲突。 方便调试和代码管理。 可同时定义多个常量,提升开发效率。
共享内存空间,节省空间。 需要进行内存对齐。 成员存取顺序从低地址开始。
发布日期:2021-05-07 11:08:12
浏览次数:26
分类:精选文章
本文共 1568 字,大约阅读时间需要 5 分钟。
位段、枚举与联合 - C语言中数据存储与结构优化
位段
位段的基本声明
位段是一种优化存储空间的数据结构,主要用于存储整型数据。位段的成员必须是整型家族(如int
, unsigned int
, signed
),这是因为位段的成员是按比特存储的,浮点类型会导致存储难以计算。
位段的命名规则
位段成员的命名格式为“名称:数字”,例如:
struct BitStruct { int a:4; // 4位 int b:8; // 8位 int c:16; // 16位};
这是因为位段成员的比特位数需要明确标注,避免存储时的混淆。
为什么需要位段
传统的数据存储通常使用偶数比特空间来存储整数,存储奇数位数会造成空间浪费。当数据量庞大时,这种浪费会显著增加。位段通过将多个整型位打包存储,有效利用空间,避免了不必要的浪费。
位段的存储形式
位段在存储时会将各个成员按比特对齐,例如:
struct BitStruct { int a:4; // 4位 int b:8; // 8位 int c:16; // 16位};
在计算机中,这种存储形式会映射到内存中的连续空间,方便后续访问。
位段的缺点
尽管位段能够优化存储空间,但其可移植性较差,主要原因包括:
位段的知识补充
枚举
枚举的基本定义
枚举是C语言中定义常量的强类型变量,具有严格的类型检查和命名空间隔离功能。枚举常量的取值从0开始递增,可以根据需要进行手动赋值。
枚举的应用示例
enum Color { RED = 0, GREEN = 1, BLUE = 2};
如上示例,Color
枚举类型定义了三个常量:RED
、GREEN
、BLUE
,分别对应值0、1、2。
枚举的优点
联合
联合的定义
联合是一种可以共享同一内存块的数据结构,其成员共享相同的内存空间。联合变量的大小等于最大成员的大小,且成员必须对齐到相同的字节对齐数。
联合的特点
联合的实战演练
1. 公用空间证明
#pragma pack(1)struct UnionStruct { int a; char b; short c;} UnionStruct u = {0};
上述代码中,#pragma pack(1)
表示对齐数为1字节,UnionStruct
却使用了1字节对齐。
2. 判断端字序
#pragma pack(2)struct UnionStruct { int a; short b;} UnionStruct u = {0x12345678, 0x0000};
在大端(LE)和小端(BE)机器上,int
和 short
的存储顺序不同。
3. 内存对齐验证
#pragma pack(4)struct UnionStruct { int a; double b;} UnionStruct u = {0};
上述联合的对齐数为4字节,int
和 double
都符合4字节对齐要求。
总结
位段、枚举和联合是C语言中常用的数据存储与结构优化方法。位段优化存储空间,枚举便于定义和管理常量,联合节省内存空间。然而,这些结构都有各自的局限性,具体应用时需根据需求选择合适的方案。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年05月14日 11时45分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux rsyslog 转存至日志服务器
2023-02-01
linux scp命令参数及用法详解--linux远程复制拷贝命令使用实例【转】
2023-02-01
Linux script命令记录(数据库)操作步骤
2023-02-01
linux sed 批量替换字符串
2023-02-01
linux sed命令 批量替换文件内容的方法
2023-02-01
Linux sed命令增删改查 附代码
2023-02-01
linux sed命令详解
2023-02-01
linux sed命令详解
2023-02-01
Linux Shell Shock漏洞利用和实战
2023-02-01
linux shell wc 命令
2023-02-01
linux shell 的 for 循环
2023-02-01
linux shell 编程 9 脚本中调用脚本
2023-02-01
Linux shell (ssh批量配置免秘)读取配置文件,进行远程操作
2023-02-01
Linux Shell——流程控制
2023-02-01
Linux Shell之三 高级变量及字符串
2023-02-01
Linux Shell编程新手入门教程(六)
2023-02-01
Linux Shell编程最重要的十个核心概念,零基础入门到精通,收藏这一篇就够了
2023-02-01
Linux Shell编程(19)——测试与分支
2023-02-01
Linux Shell脚本入门--grep命令详解
2023-02-01
Linux Shell脚本处理JSON字符串
2023-02-01