设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的。

比如你在C语言中定义下面这样的结构体:

struct s {
char j;
int i;
};

然后在主函数中写一句:printf("%d", sizeof(struct s))

也就是输出结构体s所占的字节数

你觉得输出结果会是多少呢?

我们知道,char型占用1个字节,int型占4个字节,那么输出的结果是5吗?

答案是否定的。你可以自己试一下,输出结果为8。

为什么会这样呢?这是因为编译器为了让程序跑得跟快,减少CPU读取数据的指令周期,对结构体的存储进行了优化。实际上第一个char型成员虽然本来只有1个字节,但实际上却占用掉了4个字节,为的是让第二个int型成员的地址能够被4整除。因此实际占用的是8个字节。

而#pragma pack(1)让编译器将结构体数据强制连续排列,这样的话,sizeof(struct s)输出的结果就是5了。

设置内存对齐为:1字节对齐。使用方法如下:

#pragma pack(n)
struct s {
int i;
char j;
};

#pragma pack()
意思就是 以下代码编译出来的是以1个字节的方式对齐的。这样能节约内存资源,但是会在效率上有所影响
可是,虽说在效率上有一定的影响,不过,如果编写的是基于协议,如串口通讯的程序,那么必须严格按照一定的规则进行接收数据包。那么,只要#pragma pack(1),让数据在内存中是连续的,才好处理的。

在协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。其协议结构定义如下:

#pragma pack(1) //调整结构体的边界对齐,让其以一个字节对齐;<使结构体按1字节方式对齐>
typedef struct
{u8 operatModeConf;u8 operatModeValue;u8 powerContrModeConf;u8 powerContrModeObj;u8 powerContrMode;u8 signPowAmpModeConf;u16 signPowAmpValue;u8 beacon1launConf;u16 beacon1launValue;u8 beacon2launConf;u16 beacon2launValue;u8 beacon3launConf;u16 beacon3launValue;
}WorkCtrlCommand_Def;
#pragma pack()
extern WorkCtrlCommand_Def *hallWorkCtrlCommand_Def;  

【C语言】#pragma pack(1) 和#pragma pack()相关推荐

  1. #pragma pack(push,1) #pragma pack(pop)

    1 引子 在程序中,有的时候我们定义结构体的时候,要用#pragma pack(push,1) & #pragma pack(pop)类似代码将结构体包起来. 一般形式如下: #pragma ...

  2. pragma pack(1) and #pragma pack(push,1)

    作用:调整结构体的边界对齐,让其以一个字节对齐: #pragma pack(1) 使结构体按1字节方式对齐例如:struct sample{char a;double b;};若不用#pragma p ...

  3. 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()

    前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...

  4. Eclipse汉化 中文语言包下载安装 Babel Language Pack

    相关链接 Java & Eclipse & Maven 使用配置方法 Eclipse平台上新建Java项目使用Junit测试 如何在Eclipse平台使用git从GitHub上下载文件 ...

  5. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解 #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注 ...

  6. #pragma warning(pop) 和 #pragma warning(push)的作用

    #pragma warning(push)是保存当前的编译器警告状态: #pragma warning(pop)是恢复原先的警告状态. 例如: #pragma warning( push ) #pra ...

  7. python中pack函数_关于pack()函数的文章推荐10篇 - pack

    php读写二进制文件可以使用pack和unpack函数. 今天要处理一个二进制文件的问题,所以需要用一下,特意了解一下pack的用法,unpack用法与此类似. 简单来说,pack函数就是给一个目标格 ...

  8. linux下打开pack文件怎么打开,PACK 文件扩展名: 它是什么以及如何打开它?

    了解 PACK 问题 打开 PACK 文件过程中所遇到的常见问题 CustoPack Tools 未安装 你尝试加载 PACK 文件并收到错误,例如 "%%os%% 无法打开 PACK 文件 ...

  9. PyCharm汉化:简单两步搞定!PyCharm怎么设置中文简体,为什么我的pycharm搜不到中文语言包(Chinese ​(Simplified)​ Language Pack)

    心灵笔记 今天我要给PyCharm汉化,这老是看英文难免眼睛有些不适应,时间长了呢还容易出现眼盲(哈啊哈哈) 用户珍贵,时间珍贵,用户的时间最珍贵 废话不多说了,直接开车.首先,你已经下载并安装好了P ...

最新文章

  1. 【转】Maven实战(七)---传递依赖
  2. maven 安装_Maven的下载、安装、配置以及验证操作
  3. cortex M内核优先级设置
  4. django ORM相关的那些操作汇总
  5. leetcode 442. Find All Duplicates in an Array | 442. 数组中重复的数据(位运算)
  6. SAP面向iOS设备推Cloud Platform SDK工具
  7. 指定查询条件,查询对应的集合List(单表)
  8. redis队列(list)
  9. 潜波(Diving Wave)
  10. Python 2.x 即将终止支持,是时候和 Python 2 讲再见了
  11. atitit.团队建设总结o6o fix
  12. 入门力扣自学笔记96 C++ (题目编号749)
  13. 2017年2月14日实习日记 RHEL下dracut制作initramfs
  14. 一年级课程表(4月2日-4月8日)
  15. 入局智能健身镜,小度破圈进行时
  16. 【Beta】 第六次Daily Scrum Meeting
  17. airvideo_如何免费获取Android中的AirVideo功能
  18. Redis - CLUSTER命令中集群管理命令详解
  19. platform驱动模型使用总结
  20. win7和ubuntu18.04安装双系统详细教程

热门文章

  1. 计算机素质教育论文800,关于素质教育的议论文800字
  2. break和continue语句的使用
  3. 习题5.2 从键盘输入n个数,求这n个数中的最大数与最小数并输出。
  4. pytorch入门:60分钟闪电战
  5. SMT的几种类型介绍
  6. python 包含语句_如何检查句子是否包含Python中的某个单词然后执行操作?
  7. HTTPS站点不安全?
  8. 项目游戏开发日记 No.0x000005
  9. TLC Flash 笔记
  10. 没事儿就别tm生病!