美文网首页
C语言中__packed 和位段的理解

C语言中__packed 和位段的理解

作者: 杜攀 | 来源:发表于2020-10-23 15:09 被阅读0次

一:__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;

}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

相关文章

  • C语言中__packed 和位段的理解

    一:__packed typedef __packed struct struct常用在数据结构中。而struct...

  • C语言位运算

    C语言位运算_C语言中文网 C语言位域(位段)_C语言中文网

  • 关于C中的位操作,了解这么多就够了

    没有对C语言中位的理解,你一定不会用std::bitset,如果理解里C中的位操作,就真心不必再使用std::bi...

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

  • C语言中 * 和 &的实际理解

    & 是位操作运算符 *代表指针 在C语言中 &可以用来拿到变量在内存中存储的地址 *可以用来拿到对应地址中的具体内...

  • oc-理解对类、对象等概念

    OC是基于C语言的面向对象的语言。C语言中没有对象的概念,为了便于开发者理解和使用面向对象的思想,OC将C语言中的...

  • C语言中同步和异步的理解

    现在我在main.c这个文件中,调用360浏览器。 分析过程:在my.exe里面继续打开另外一个程序,所以就涉及到...

  • 理解C语言中的a++、a--和++a、--a

    C语言中 a++ a-- 和 ++a --a 的区别 a++ 表示先赋值再进行加运算a-- 表示先赋值再进行减运算...

  • c语言中的位运算

    1.什么是位运算符? 位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。 C语言?供了6个位...

  • C语言中的位运算

    C语言中的位运算 结构体是唯一一种允许控制内存位(bit)的数据结构,称作位域(Bit Field) 位域不能离开...

网友评论

      本文标题:C语言中__packed 和位段的理解

      本文链接:https://www.haomeiwen.com/subject/lapvmktx.html