博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位域/字节对齐
阅读量:4923 次
发布时间:2019-06-11

本文共 1255 字,大约阅读时间需要 4 分钟。

#include "stdafx.h"#include "windows.h"int _tmain(int argc, _TCHAR* argv[]){ typedef struct {  unsigned char a:2;  unsigned char :3;  unsigned char b:7;  unsigned char d:2;  } BIT_FIELDS; BIT_FIELDS bit; bit.a=1; bit.b=7; bit.d=15; printf("sizeof(bit)=%d\n",sizeof(bit));    //=3 printf("a=%d\n",bit.b); / typedef struct {  char a;  int b;  char d; }t; printf("sizeof(t)=%d\n",sizeof(t));   //=12 char str1[]="abcde"; char str2[]="我是中国人";  printf("strlen(str1)=%d\n",strlen(str1)); printf("sizeof(str1)=%d\n",sizeof(str1));  getchar(); return 0;}struct Mystruct1{   bool a;   int  b;   bool c;}

    在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

    第一个成员变量a占用1个字节,相对于结构的起始地址偏移量为0,满足对齐方式;第二个成员变量b占用4个字节,下一个可用的地址的偏移量为1,不是4的倍数,需要补足3个字节才能使偏移量为4(满足对齐方式),因此vc自动填充3个字节,b存放在偏移量为4的地址上,它占用4个字节。第三个变量c占用1个字节,下一个可用的地址为8(满足对齐方式),所以存放在偏移量为8的地址上;所有成员都分配了空间4+4+1=9,不是结构的字节边界数(sizeof(int))的倍数,所以填充三个字节以满足结构的大小为sizeof(int)的倍数,这样总的空间大小为4+4+4=12。

 

使用位域的主要目的是压缩存储,其大致规则为:

1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

 

转载于:https://www.cnblogs.com/yangjj08/p/10153661.html

你可能感兴趣的文章
你的跑步姿势正确吗? 教你正确跑步姿势 & 常识
查看>>
(转)Dubbo 简单Dome搭建
查看>>
mybatis在xml文件中处理大于号小于号的方法
查看>>
联想 P70-t 免解锁BL 免rec Magisk Xposed 救砖 ROOT
查看>>
wince扫描功能
查看>>
第四章
查看>>
missing python bz2 module
查看>>
CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第十节
查看>>
单个单选框radio 点击选中点击取消选中
查看>>
团队冲刺随笔合集—Beta阶段
查看>>
Android ANR的产生与分析
查看>>
大型网站架构
查看>>
Appium+python自动化29-appium对博客园APP进行自动化测试
查看>>
cocos2d实例-移动精灵
查看>>
SQL Server 2005 导出包含(insert into)数据的SQL脚本 (使用存储过程)
查看>>
Python控制键盘鼠标:pynput,mouse,keyboard
查看>>
这里的*号实际表示就是RAC中所有实例都使用
查看>>
在python中编写socket服务端模块(二):使用poll或epoll
查看>>
解决Synergy的鼠标无法从服务器(server)机屏幕移动到客户机(client)屏幕的问题
查看>>
第三代搜索推出网民评价系统,seo末日还会远吗?
查看>>