#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。

#pragma pack (n)             作用:C编译器将按照n个字节对齐。
#pragma pack ()               作用:取消自定义字节对齐方式。


#pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐

#pragma pack(pop)            作用:恢复对齐状态

因此可见,加入push和pop可以使对齐恢复到原来状态,而不是编译器默认,可以说后者更优,但是很多时候两者差别不大

如:

#pragma pack(push) //保存对齐状态

#pragma pack(4)//设定为4字节对齐

  相当于 #pragma  pack (push,4)  

 

#pragma  pack (1)           作用:调整结构体的边界对齐,让其以一个字节对齐;<使结构体按1字节方式对齐>

#pragma  pack ()

例如:

#pragma pack(1)

struct sample
{
char a;
double b;
};

#pragma pack()

注:若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节);若用#pragma pack(1),则sample按1字节方式对齐sizeof(sample)==9.(无空字节),比较节省空间啦,有些场和还可使结构体更易于控制。

应用实例

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

#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER 
{
     short SrcPort; 
// 16位源端口号
     short DstPort; 
// 16位目的端口号
     int SerialNo; 
// 32位序列号
     int AckNo; 
// 32位确认号
     unsigned char HaderLen : 4; 
// 4位首部长度
     unsigned char Reserved1 : 4; 
// 保留6位中的4位
     unsigned char Reserved2 : 2; 
// 保留6位中的2位
     unsigned char URG : 1;
     unsigned char ACK : 1;
     unsigned char PSH : 1;
     unsigned char RST : 1;
     unsigned char SYN : 1;
     unsigned char FIN : 1;
     short WindowSize; 
// 16位窗口大小
     short TcpChkSum; 
// 16位TCP检验和
     short UrgentPointer; 
// 16位紧急指针
}; 
#pragma pack()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Drainage Ditches - poj 1273(网络流模板)

题意&#xff1a;1是源点&#xff0c;m是汇点&#xff0c;求出来最大流量&#xff0c;没什么好说的就是练习最大流的模板题 ************************************************************** 先用Edmonds-Karp的算法做一下试试吧重边贡献了 1W&#xff0c;要加上所有的重边才算…

sawmill全方位日志分析大师

Sawmill 是一套崭新的集中式(中文)日志报表系统&#xff0c;除了提供收集设备或服务的日志&#xff0c;整合、分析成有效报表外&#xff0c;并能降低企业成本与信息管理人员减少学习报表时间&#xff0c;且能于全球各地上网即可获得IT信息。 集中式 &#xff1a; 集中整合各式设…

[react] React中在哪捕获错误?

[react] React中在哪捕获错误&#xff1f; 在react 15 极其以前的版本中,组件内的UI异常将中断组件内部状态&#xff0c;导致下一次渲染时触发隐藏异常。React并未提供友好的异常捕获和处理方式&#xff0c;一旦发生异常&#xff0c;应用将不能很好的运行。而React 16版本有所…

VC6.0 控件Radio Button的使用

From: http://www.cppblog.com/Lee7/archive/2007/09/13/32152.html 使用方法: 1.建立一个基于对话框的用用程序,在其中加入三个Radio Button,ID分别为: IDC_RADIO1,IDC_RADIO2,IDC_RADIO3 2.控件的初始化: 在对话框类的OnInitDialog中加入代码: …

Qt 实现QT控件中的QLabel显示图片并自适应显示

一、需求 实现QT控件中的QLabel显示图片&#xff0c;并自适应显示。 二、代码 QImage Image; Image.load(":/image/image/logo.jpg"); QPixmap pixmap QPixmap::fromImage(Image); int with ui->label_logo->width(); int height ui->label_logo->…

linux RTC 驱动模型分析

linux RTC 驱动模型分析RTC(real time clock)实时时钟&#xff0c;主要作用是给Linux系统提供时间。RTC因为是电池供电的&#xff0c;所以掉电后时间不丢失。Linux内核把RTC用作“离线”的时间与日期维护器。当Linux内核启动时&#xff0c;它从RTC中读取时间与日期&#xff0c;…

Install Docker Mac OS X

检查 Mac OS version 要求必须是 OS X 10.6 Snow Leopard or newer to run Boot2Docker安装 Boot2Docker 列表内容下载地址&#xff1a;https://github.com/boot2docker/osx-installer/releases/download/v1.7.0/Boot2Docker-1.7.0.pkg 下载后点击安装&#xff0c;就是按照提示…

linq to sql报错,

以上是由于我把关联表中的string类型写成int类型所导致的&#xff0c;记一下&#xff0c;备用。转载于:https://www.cnblogs.com/server126/archive/2011/05/25/2057416.html

[react] React怎样引入svg的文件?

[react] React怎样引入svg的文件&#xff1f; import React from react; import logo from ./logo.png; // Tell Webpack this JS file uses this imagefunction Header() {// Import result is the URL of your imagereturn <img src{logo} alt"Logo" />; } …

[VC6] RadioBox使用入门

基于对话框的应用程序&#xff0c;界面如下&#xff1a; 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 具体请参考代码&#xff1a; 关键代码&#xff1a; // del2Dlg.cpp : implementation file //#include "stdaf…

树莓派使用STEP1:装系统

1、windows安装SD卡格式化软件&#xff1a;SDFormatter.exe 2、windows安装系统烧录软件Win32DiskImager.exe 3、下载镜像&#xff1a;https://www.raspberrypi.org/downloads/raspbian/ 并解压缩 4、用Win32DiskImager将下载的镜像文件烧录进SD卡。 5、插上SD到树莓派&…

css实现文字过长省略显示

.simpleName {width:110px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }<div class"simpleName"><a target"_blank" href"">文本</a></div> 1、width:超高110px部分省略显示。 2、white-space:now…

PAL/NTSC/SECAM,这是全球现行的三种模拟技术彩色电视的制式

From: http://zhidao.baidu.com/question/443746422.html PAL&#xff0c;NTSC&#xff0c;还有SECAM&#xff0c;这是全球现行的三种模拟技术彩色电视的制式。NTSC&#xff08;National Television System Committee&#xff09;制是最早的彩电制式&#xff0c;1952年由美国国…

V4L2

前言&#xff1a;目前正在忙于ARM平台的Linux应用程序的开发&#xff08;其实是刚刚起步学习啦&#xff09;。底层的东西不用考虑了&#xff0c;开发板子提供了NAND Bootloader&#xff0c;和Linux 2.6的源码&#xff0c;而且都编译好了。自己编译的bootloader可以用&#xff0…

天龙2 场景地图人物 方向箭头 方法

打开天龙2场景地图&#xff0c;会有一个小箭头的图片&#xff0c;代表人物位置和方向&#xff0c;方向的做法是&#xff1a; 1 生成360度方向的一些图片&#xff08;数量可根据情况而定&#xff09; 2 计算角色的方向&#xff0c;从第一步生成的图片里面取一张&#xff0c;贴到…

[react] 说说你对Relay的理解

[react] 说说你对Relay的理解 Relay是Facebook在React.js Conf&#xff08;2015年1月&#xff09;上首次公开的一个新框架&#xff0c;用于为React应用处理数据层问题。 在Relay中&#xff0c;每个组件都使用一种叫做GraphQL的查询语句声明对数据的依赖。组件可以使用 this.p…

树莓派使用STEP2:设置网络

安装好系统并开机&#xff0c;插入鼠标键盘和显示器&#xff0c;登陆系统&#xff0c;打开终端。按以下操作。 1、sudo raspi-config 进入配置&#xff0c;打开SSH功能。 Interfacing Options -> SSH 2、扩展系统内存。 Advanced options -> Expand Filesystem 3、设置…

HDU5187 zhx#39;s contest(计数问题)

主题链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5187 题意&#xff1a; 从1~n&#xff0c;有多少种排列 使得 a1~ai 满足单调递增或者单调递减。ai~an 满足单调递增或者递减。 非常明显的组合问题 从n个数种选出i个数 剩下的数要满足单调递增或者递减或者递…

文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd

From: http://blog.163.com/xychenbaihuyeah/blog/static/1322296552011625112831213/ 文件指针---->文件描述符: // fp ----> fd FILE *fp NULL; fp fopen("/home/billchen/test.txt","r"); //得到…

linux3.0-内核自带led驱动移植

********************************************************************************************************************************************************************************** cpu : s3c2440(arm9) linux内核&#xff1a;linux-3.0 开发板 &am…