一:__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语言packed,C 语言中 __packed

    关键字: __packed,C语言,内存对齐 [正文] 简单的说,__packed用于表示C语言中结构的压缩,即:没有填充和对齐. 定义如下: __packed struct P { ... }; s ...

  2. C语言结构体中__packed 和位段的理解!

    C语言中__packed 和位段的理解 一:__packed typedef __packed struct struct常用在数据结构中.而struct的字节对齐方式对于嵌入式底层的程序员来讲是必须 ...

  3. Go 知识点(19)— Go 语言中的野指针

    野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的.在 Go语言中,布尔类型的零值为 false,数值类型的零值为 0,字符串类型的零值为 "", ...

  4. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

  5. 单片机c语言中的循环语句,单片机c语言教程:C51循环语句

    循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作.如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的( ...

  6. python调用什么函数实现对文件内容的读取_如何使用python语言中的方法对文件进行读写操作...

    在我们使用python语言中的文件时,可以使用open()方法打开文件,close()方法关闭文件,read()方法读取文件内容,write()方法写入内容到文件中.下面利用几个实例说明文件读写方法, ...

  7. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  8. C语言中的指针和内存泄漏

    对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但 ...

  9. C语言中连续调用rand函数,返回值不变

    C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...

最新文章

  1. 数据结构题及c语言版答案9.14,十套数据结构试题+答案+难题解析(精校版)
  2. JavaScript初学者编程题(23)
  3. R语言gganimate包创建可视化gif动图、可视化动图:ggplot2可视化静态散点图、gganimate包创建动态散点分面图(facet_wrap)动画基于transition_time函数
  4. 20189222 《网络攻防实践》 第四周作业
  5. USB共享网络:android手机通过USB与Ubuntu进行socket网络通信
  6. 学习vim 从常用按键开始
  7. Gallery with Video
  8. 在word中插入代码段的方法[转]
  9. 04737 c++ 自学考试2019版 第四章课后练习 程序设计题 2
  10. Linux中对两文件处理
  11. html一个页面多个动画,如何在单个html页面中添加两个相同的adobe边缘动画?
  12. CentOS下MySQL主从同步配置
  13. [转载] python迭代器
  14. 网站在线沟通工具,网站即时聊天工具-TTKEFU在线客服系统功能介绍
  15. 全志 起家产品 A31S四核:昂达V819mini平板试玩
  16. 如何使用Arduino和R305制作指纹考勤系统
  17. Go中chan引发的协程死锁
  18. CodeForces 760B Frodo and pillows
  19. iOS中JPG PNG GIF格式图片的区分
  20. ​华为NTP配置命令

热门文章

  1. android百度地图画圆,Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法...
  2. html5 drawimage,HTML5中drawImage用法分析
  3. Python基于民航业知识图谱的自动问答系统(附源码)
  4. 解决div里面img图片下方有空白的问题
  5. Debug和Release的区别是什么(非常详细)?
  6. 一文读懂“数据分发服务DDS”(Data Distribution Service,RTPS,OMG)
  7. CSS伪元素及元素的显示与隐藏的学习
  8. 入坑VUE的一点心得
  9. 第001讲-Spark内核解密:Spark五大功能组件
  10. Promise 原理