-
-
[原创]#pragma pack 笔记
-
发表于: 2013-11-19 18:47 3351
-
#pragma pack 笔记
typedef struct
{
unsigned short IDTLimit;
unsigned long IDTbase;
} IDTINFO;
sizeof(IDTINFO)等于8,在内存中,IDTINFO.IDTLimit与DTINFO.IDTbase之间填充了两个字节。
原来编译器为了优化性能,struct里的每个成分的起始地址按照一定规则对齐。
默认的规则是,char型变量的地址,必须按sizeof(char)对齐,换言之起始地址必须能被sizeof(char)整除;int型变量的地址,必须按sizeof(int)对齐。
如果struct内含struct_1,则struct_1在struct中的地址,按照struct_1内部普通类型(char,int等)中最大的对齐值对齐。
#pragma pack可以影响默认规则,#pragma pack(n)意为,取n与默认规则的对齐值中的小者来对齐。
#pragma pack(1)
typedef struct
{
unsigned short IDTLimit;
unsigned long IDTbase;
} IDTINFO;
#pragma pack()
sizeof(IDTINFO)等于6,因为IDTINFO.IDTLimit与DTINFO.IDTbase的地址都按1字节对齐。
#pragma pack()为撤消#pragma pack(1)的作用。
#pragma pack(show) 编译时以warning消息来获得当前的指定对齐值,VS中通常为8.
#pragma pack([push | pop]) 保存当前对齐值/应用保存的对齐值.
typedef struct
{
unsigned short IDTLimit;
unsigned long IDTbase;
} IDTINFO;
sizeof(IDTINFO)等于8,在内存中,IDTINFO.IDTLimit与DTINFO.IDTbase之间填充了两个字节。
原来编译器为了优化性能,struct里的每个成分的起始地址按照一定规则对齐。
默认的规则是,char型变量的地址,必须按sizeof(char)对齐,换言之起始地址必须能被sizeof(char)整除;int型变量的地址,必须按sizeof(int)对齐。
如果struct内含struct_1,则struct_1在struct中的地址,按照struct_1内部普通类型(char,int等)中最大的对齐值对齐。
#pragma pack可以影响默认规则,#pragma pack(n)意为,取n与默认规则的对齐值中的小者来对齐。
#pragma pack(1)
typedef struct
{
unsigned short IDTLimit;
unsigned long IDTbase;
} IDTINFO;
#pragma pack()
sizeof(IDTINFO)等于6,因为IDTINFO.IDTLimit与DTINFO.IDTbase的地址都按1字节对齐。
#pragma pack()为撤消#pragma pack(1)的作用。
#pragma pack(show) 编译时以warning消息来获得当前的指定对齐值,VS中通常为8.
#pragma pack([push | pop]) 保存当前对齐值/应用保存的对齐值.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [原创]Arm thumb Cortex-M0 opcode 解析 2493
- IO完成端口原理 2312
- 代码角度看SSL握手过程 13466
- 给Internet Download Manager打补丁 5688
- [原创]分析X绒hrdevmon.sys,突破U盘访问控制,摄像头保护原理 9124
看原图
赞赏
雪币:
留言: