`

#pragma pack(1) 的意义是什么

    博客分类:
  • VC++
 
阅读更多

转自:https://blog.csdn.net/xiao156520/article/details/41178805


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

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

struct s {
char ch;
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 ch;
};
#pragma pack()|

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

 

分享到:
评论

相关推荐

    Sdsoc优化指南

    我觉得一个比较实用的文档,关于Sdsoc优化指令。使用方法和意思。

    c++11智能指针解析——揭开底层面纱,完整理解智能指针.pdf

    找了半天后发现是 c++字节补齐问题,期间包括使⽤#pragma pack(1)来限定字节对齐⽅式等各种条件,也是把我们搞的七晕⼋素,总算是进⼀步了解了c++对 象结构以及编译器的操作(有机会的话也补充下字节对齐的理解)。...

    c++ 面试题 总结

    1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类...

    黑客反向工程

    #pragma pack (1) struct ethernet_head { unsigned char dest_mac[6]; //目标主机MAC地址 unsigned char source_mac[6]; //源端MAC地址 unsigned short eh_type; //以太网类型 }; struct arp_head { ...

    可以仿造ip

    #pragma pack(1) #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #define OICQ_MAX_PACKET 1024 #define OICQ_MAX_MSG 512 #define ...

    C语言深度揭秘

    3.6.8,#pragma pack.............................................. 69 3.6.8.1,为什么会有内存对齐?................. 70 3.6.8.2,如何避免内存对齐的影响............. 70 3.7, #运算符..........72 3.8,##...

    C语言深度解剖

    1.5.2,sizeof(int)*p表示什么意思?........................................................................18 1.4,signed、unsigned关键字.................................................................

    C语言深度解剖(完美版).pdf

    1.5.2,sizeof(int)*p 表示什么意思?........................................................................18 1.4,signed、unsigned 关键字...............................................................

    C语言深度解剖_word版

    1.5.2,sizeof(int)*p 表示什么意思?........................................................................18 1.4,signed、unsigned 关键字...............................................................

    C语言深度剖析 陈正冲

    1.5.2,sizeof(int)*p 表示什么意思?........................................................................18 1.4,signed、unsigned 关键字...............................................................

    C 语言 深 度 剖析

    1.5.2,sizeof(int)*p 表示什么意思?........................................................................18 1.4,signed、unsigned 关键字...............................................................

Global site tag (gtag.js) - Google Analytics