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;
}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 和位段的理解!相关推荐

  1. C语言结构体中的位段

    C语言结构体中的位段 位段的内存分配 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型 位段的空间上是按照需要以4个字节( int )或 ...

  2. 结构体自定义指针函数c语言,C语言结构体中的函数指针

    C语言结构体中的函数指针 C语言结构体中的函数指针内容由小编收集整理,希望对您的 学习有所帮助!更多内容请关注应届毕业生考试网! 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准 ...

  3. C语言结构体中定义函数指针详解

    C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...

  4. c语言的结构体能存放函数吗,在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  5. 结构体自定义指针函数c语言,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  6. c语言 一个函数返回结构体指针,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  7. C语言结构体中的冒号用法

    结构体中的冒号表示位域. 位域出现的原因是由于某些信息的存储表示只需要几个bit位就可以表示而不需要一个完整的字节,同时也是为了节省存储空间和方便处理. 其表示形式为: struct 位域结构名 { ...

  8. C语言结构体中字符串赋值

    struct student { char name[20]; }; #include <stdio.h> main() { struct student s1; s1.name = &q ...

  9. C语言结构体中指针指向数组,指向结构体类型数组的指针的使用

    指向结构体类型数组的指针的使用 定义一个结构体类型数组,其数组名是数组的首地址,下面是关于指向结构体类型数组的指针的使用具体介绍,欢迎阅读! 定义结构体类型的指针,既可以指向数组的元素,也可以指向数组 ...

最新文章

  1. 【设计原则和建议】 构造和析构对象
  2. Maven学习总结(十)——使用Maven编译项目gbk的不可映射问题
  3. Android 即时通讯开发小结(二)
  4. 《》猿从程序书评项目经理-猿自办节目
  5. python中range 函数_Python中的range函数
  6. [SDOI2015]约数个数和
  7. 史上最“可怕”的数学科普,能全都看懂的只有天才!
  8. [单刷APUE系列]第十一章——线程[1]
  9. 大公司病?记改一个文字颜色的过程
  10. 【linux】Can't connect to local MySQL server through socket和Plugin 'auth_socket' is not loaded报错...
  11. rip协议中周期性广播路由信息的报文_关于RIP的一点小笔记--华为
  12. php人民币转换,人民币大小写转换(PHP版)
  13. 虚拟化是什么,虚拟化技术分类
  14. 计算机上静音快捷键是什么,电脑静音快捷键是什么(电脑静音快捷键怎么设置)...
  15. pytorch gpu版本安装
  16. c# 判断路径是否存在
  17. Python挑战游戏( PythonChallenge)闯关之路Level- 2
  18. 计算机因特尔网络论文,[心得]英特尔
  19. 最小二乘支持向量机预测matlab实现,最小二乘支持向量机及其 Pre-computed Kernel 的 matlab 实现...
  20. LabVIEW编程实例:如何通过TCP协议进行数据通信

热门文章

  1. 【NLP】自然语言处理的高级序列建模
  2. 【UE4】RTS建筑选中效果
  3. 在3A游戏公司工作是什么体验?30岁3D艺术家经验分享
  4. MySQL 基础名词符号解释第一部分(带简单例子)
  5. 指定nacos配置文件格式为yml格式
  6. 冲上云霄!“追星”C919
  7. tinyxml/tinyxml2遍历所有节点
  8. 隔行如隔山!大家来818各行业鲜为人知的内幕吧
  9. 二维伪随机序列结构光编码
  10. 修改oracle数据库的名称