当前位置:网站首页>【C语言】#pragma pack(1) 和#pragma pack()
【C语言】#pragma pack(1) 和#pragma pack()
2022-06-10 10:16:00 【米杰的声音】
设置结构体的边界对齐为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; 边栏推荐
猜你喜欢

一个独特的简历生成器,开源了!

dried food! Training method of machinetranslation model based on mask label smoothing

“隔离险”成“网红”产品,不少投保者却表示:理赔难

Today, 19:30 | graphics special session - Gao Lin, teacher team of Institute of computing technology, Chinese Academy of Sciences

Neo hacker song's award-winning list has been announced. Who owns tens of thousands of dollars of gold?

Qchart note 1: simple linear diagram lineseries

2023 Wangdao C language training camp (binary search tree - sequential search - half search)

工业互联网架构图

"Great freehand flower and bird painting master Mr. likuchan" blockbuster digital collection launched in the whole network

phpstrom 将项目上传码云
随机推荐
创建swift颜色类
Question bank and answers of 2022 metal and nonmetal mine hoist operation examination
PV操作每日一题-黑白棋子问题
Neo 黑客松获奖名单揭晓,上万美金花落谁家?
Detailed steps for installing mysql+django under mac
PV操作每日一题-橘子苹果问题(高阶版)
协程asyncio异步编程
Install the latest version of cocoapods tutorial
【兴趣阅读】DeepInf: Social Influence Prediction with Deep Learning
解决Typescript文件被识别为视频的问题
Today, 19:30 | graphics special session - Gao Lin, teacher team of Institute of computing technology, Chinese Academy of Sciences
已经过去多长时间的方式显示时间
MySQL基础
HPCA名人堂成员蒋晓维博士,任职大禹智芯首席科学家
[730. statistics of different palindrome subsequences]
2022年金属非金属矿山提升机操作考试题库及答案
软件测试电商项目实战(实战视频B站已发布)
Mixer: an indispensable component of video conference recording
EG2131测试电路
2023王道C语言训练营(线索二叉树)