#pragma pack
来源:互联网 发布:中日网络战 编辑:程序博客网 时间:2024/05/20 21:24
通过#pragma pack(n)改变C编译器的字节对齐方式
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
例如,下面的结构各成员空间分配情况:
struct test
{
};
更改C编译器的缺省字节对齐方式
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
应用实例
在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。其协议结构定义如下:
#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER
{
};
#pragma pack() // 取消1字节对齐方式
- #pragma pack
- #pragma pack
- #pragma pack
- #pragma pack
- pragma pack
- #pragma pack
- #pragma pack
- #pragma pack
- #pragma pack
- #pragma pack()
- #pragma pack
- #pragma pack
- #pragma pack
- #pragma pack
- #pragma pack
- pragma pack
- #pragma pack
- #pragma pack()
- Ubuntu下C、C++进程间的编程
- 开机自动打开“我的电脑”窗口
- S3C2410&&WINCE6.0&&NBOOT
- java json字符串转换为对象,转换为list
- Struts2+Hibernate+Spring框架搭建(二)
- #pragma pack
- cocos2dx-3.0rc0安装和创建新工程
- Struts2+Hibernate+Spring框架搭建(三)
- 自定义listview 实现仿qq聊天列表左滑删除效果
- PROC---动态SQL
- 使用StoryBoard的时候加入用户引导页面
- Linux信号列表
- Leedcode Max Points on a Line
- 底层设置