结构体大小计算之位域字段
类和结构可包含比整型类型占用更少存储空间的成员。这些成员被指定为位域。位域成员声明符规范的语法如下:
语法
declarator : constant-expression
下面的示例声明包含位域的结构:
// bit_fields1.cpp // compile with: /LD struct Date {unsigned short nWeekDay : 3; // 0..7 (3 bits)unsigned short nMonthDay : 6; // 0..31 (6 bits)unsigned short nMonth : 5; // 0..12 (5 bits)unsigned short nYear : 8; // 0..100 (8 bits) };
Date 类型的对象的概念上的内存布局如下图所示。
数据对象的内容布局
请注意,nYear 的长度为 8 位,并且会溢出声明类型 unsigned short 的字边界。因此,它始于新 unsigned short 的开头。并不必使所有位域均适合基础类型的对象;根据声明中请求的位数来分配新的存储单元,因此该结构体大小为4个字节。声明为位域的数据从低位到高位进行排序,如上图所示。
如果结构的声明包含长度为 0 的未命名字段(如以下示例所示),
// bit_fields2.cpp // compile with: /LD struct Date {unsigned nWeekDay : 3; // 0..7 (3 bits)unsigned nMonthDay : 6; // 0..31 (6 bits)unsigned : 0; // Force alignment to next boundary.unsigned nMonth : 5; // 0..12 (5 bits)unsigned nYear : 8; // 0..100 (8 bits) };
则内存布局如下图中所示。
带有零长度位域的数据对象的布局
位域的基础类型必须是整型类型,如基本类型中所述。
总结如下
使用位域的主要目的是压缩存储,其大致规则为:
- 1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
- 2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
- 3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
- 4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
- 5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
typedef struct AA{unsigned char b1:5;unsigned char b2:5;unsigned char b3:5;unsigned char b4:5;unsigned char b5:5;
}AA;/*sizeof(AA) = 5*/typedef struct BB {unsigned int b1:5;unsigned int b2:5;unsigned int b3:5;unsigned int b4:5;unsigned int b5:5;
}BB;/*sizeof(BB) = 4*/typedef struct CC {int b1:1;int :2;//无影响int b3:3;int b4:2;int b5:3;short b6:4;int b7:1;}CC; /*sizeof(CC) = 12*/
结构体大小计算之位域字段相关推荐
- 结构体大小计算与位域大小计算
结构体大小计算与位域大小计算 本博文纯属个人理解,有错误请多指正. 首先,各个变量所占的字节: 类型 字节(64位) 字节(32位) char 1 1 unsigned char 1 1 short ...
- 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法
结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...
- C语言sizeof结构体大小计算
一.一般类型 约定为32位系统,即char 1字节.short 2字节.int 4字节,指针是地址4个字节 定义:偏移量 偏移量指的是结构体变量中成员的地址和结构体变量地址的差.结构体大小等于最后一个 ...
- 基础 - 结构体大小计算
1 // 结构体大小.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <windows.h> ...
- c语言struct结构体大小计算
直入主题,要判断一个结构体所占的空间大小,大体来说分三步走: 1.先确定实际对齐单位,其由以下三个因素决定 1> CPU周期 WIN vs qt 默认8字节对齐 Linux 32位 默认4 ...
- C语言结构体大小计算
这篇文章来探讨一下C语言中,结构体占的内存大小如何计算. printf("str = %d", sizeof(struct str));//用这个方法来查看一个结构体的大小 我尝试 ...
- 结构体大小及其位域问题(from:byr)
问题: struct mybitfields { unsigned short a : 4; unsigned short b : 5; unsigned short c : 7; ...
- C语言结构体详解(结构体定义,使用,结构体大小等)
c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...
- 结构体大小如何计算?
以下内容摘自此处: 作者:太平小小草 链接:https://www.jianshu.com/p/e772fff47465 来源:简书 结构体大小计算有三个原则: 一,结构体变量的首地址,必须是结构体 ...
最新文章
- Python三十年技术演变史
- cheerio api
- ABAP 740里的新语法 - LET表达式
- 【算法系列之六】两整数之和
- linux ppp拨号 USB,linux下ppp拨号上网
- mongodb指南(翻译)(十六) - developer zone - 何时使用GridFS
- 度量分析之报告信息的四个层次:数据,信息,分析,措施
- [Erlang 0022] It solves the right problems in the right way at the right time
- mysql join 组合索引,图文详解MySQL中两表关联的连接表如何创建索引
- Pascal数据结构与算法
- 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。
- HTML 有序列表 字母,HTML之有序列表教程
- [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
- Unity的WebGL发布在IIS上并加载资源的若干问题
- 网站如何过服务器的白名单,服务器怎么添加域名白名单
- 使用yagmail模块群发工资条
- 用python实现双人五子棋(终端版)
- 我可以处理Flutter集成百度地图问题解决
- Matlab数字信号处理的仿真系统(具有界面)
- 关于B/S模式系统的设计与实现
热门文章
- AOP 的详细说明以及基本的使用
- Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法
- 征服英语的30个好习惯 --- 李阳
- 双系统电脑从window切换到ubuntu,外接显示屏用不了了(显卡驱动问题,降低驱动解决)
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
- 本地客户端 dbeaver-连接HIVE库
- 偶然发现一个学习python的好地方
- Redis 更新key值导致过期时间失效问题
- android listview使用glide异步加载图片错位,闪烁问题
- C#:EF与ORM的详解。