C语⾔结构体中__packed和位段的理解!
C语⾔中__packed 和位段的理解
⼀:__packed
typedef __packed struct
struct常⽤在数据结构中。⽽struct的字节对齐⽅式对于嵌⼊式底层的程序员来讲是必须掌握的。现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照⼀定的规则在空间上排列,⽽不是顺序的⼀个接⼀个的排放,这就是对齐。
对齐的作⽤和原因:各个硬件平台对存储空间的处理上有很⼤的不同。⼀些平台对某些特定类型的数据只能从某些特定地址开始存取。⽐如有些架构的CPU在访问 ⼀个没有进⾏对齐的变量的时候会发⽣错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进⾏对齐,会在存取效率上带来损失。⽐如有些平台每次读都是从偶地址开始,如果⼀个int型(假设为32位系统)如果存放在偶地址开始的地⽅,那么⼀个读周期就可以读出这32bit,⽽如果存放在奇地址开始的地⽅,就需要2个读周期,并对两次读出的结果的⾼低字节进⾏拼凑才能得到该32bit数 据。显然在读取效率上下降很多。
C/C++语⾔中struct结构体定义中__packed的作⽤是什么?
例如代码为:
typedef struct __packed test_s
{
int i;
float f;
double d;
char c;
网页float是什么意思}test_t;
(1)__packed是字节对齐的意思。⽐如说int float double char它的总⼤⼩是4 + 4 + 8 + 1 = 17,但如果不⽤__packed的话,系统将以默认的⽅式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不⾜4字节以4字节补齐)。
(2)在VS2008上述⽅法不能⽤了,如果想设置对齐⽅式,只要选择⼯程属性->配置属性->C/C++->代码⽣成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma pack(4) 4字节对齐的意思,其它同理。
#pragma pack (1) /*指定按1字节对齐*/
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
__packed是进⾏⼀字节对齐。使⽤_packed⼀般会以降低运⾏性能为代价,由于⼤多数cpu处理数据在合适的字节边界数的情况下会更有效,packed的使⽤会破坏这种⾃然的边界数。
⼆:位段
struct packed-data
{
unsigned a:2;
unsigned b:6;
unsigned c:4;
unsigned d:4;
int i;
}data;
其中冒号表⽰啥意思?
C语⾔中,这叫 “位段”,C语⾔允许在⼀个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利⽤位段能够⽤较少的位数存储数据。
冒号出现在struct结构当中表⽰只占⽤8位中的n位。也就是说,假如有如下代码:
unsigned  a1:1;
unsigned a2:2;
a1变量的范围为 0 1 ,a2的范围就是 0,1,2,3

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。