首页
社区
课程
招聘
[原创]#pragma pack 笔记
发表于: 2013-11-19 18:47 3351

[原创]#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]) 保存当前对齐值/应用保存的对齐值.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//