Windows 32、64位系统编译器各数据类型大小和字节对齐关系
何为32位64位?
32位64位其实就是32bit 64bit ,32位cpu单次处理指令4字节,64位8字节,因为1字节=1byte=8bit(32/8=4字节,64/8=8字节)
32位编译器:32位系统下指针占用4字节
64位编译器:64位系统下指针占用8字节
struct结构体成员中对齐关系:
字节对齐的细节和具体编译器实现相关,但一般而言,需满足以下四个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
4)结构体作为数据成员的对齐规则:在一个struct中包含另一个struct,内部struct应该以它的最大数据成员大小的整数倍开始存储
随便贴几个32/64相同结构体字节对齐填充示例:
{32位}
_UNICODE_STRING = packed recordLength : USHORT;MaximumLength : USHORT;Buffer : PWideChar;end;UNICODE_STRING = _UNICODE_STRING;PUNICODE_STRING =^_UNICODE_STRING;{64位}_UNICODE_STRING64 = packed recordLength : USHORT; //USHORT=2字节MaximumLength : USHORT;Fill : DWORD; //填充4字节对齐Buffer : ULONG64;//ULONG64; //PVOID64end;UNICODE_STRING64 = _UNICODE_STRING64;PUNICODE_STRING64 =^_UNICODE_STRING64;{32位} PLDR_DATA_TABLE_ENTRY = ^LDR_DATA_TABLE_ENTRY;LDR_DATA_TABLE_ENTRY = packed RecordInLoadOrderModuleList:LIST_ENTRY;InMemoryOrderModuleList:LIST_ENTRY;InInitializationOrderModuleList:LIST_ENTRY;BaseAddress:Cardinal;EntryPoint:Cardinal;SizeOfImage:Cardinal;FullDllName:UNICODE_STRING;BaseDllName:UNICODE_STRING;Flags:Cardinal;LoadCount:Word;TlsIndex:Word;SectionHandle:Cardinal;CheckSum:Cardinal;TimeDateStamp:Cardinal;end;{64位}PLDR_DATA_TABLE_ENTRY64= ^LDR_DATA_TABLE_ENTRY64;LDR_DATA_TABLE_ENTRY64 = packed recordInLoadOrderModuleList:LIST_ENTRY64;//PVOID64;//LIST_ENTRY;InMemoryOrderModuleList:LIST_ENTRY64;//PVOID64;//LIST_ENTRY;InInitializationOrderModuleList:LIST_ENTRY64;//PVOID64;//LIST_ENTRY;BaseAddress:ULONG64;EntryPoint:ULONG64;SizeOfImage:ULONG64;//ULONG; //8字节对齐 FullDllName:UNICODE_STRING64;BaseDllName:UNICODE_STRING64;Flags:ULONG;LoadCount:USHORT;TlsIndex:USHORT;end;{32位}PPEB_LDR_DATA =^PEB_LDR_DATA;PEB_LDR_DATA = packed recordLen:Cardinal;Initialized:Bool;SsHandle:PPointer;InLoadOrderModuleList:LIST_ENTRY;InMemoryOrderModuleList:LIST_ENTRY;InInitializationOrderModuleList:LIST_ENTRY;end;{64位}PPEB_LDR_DATA64= ^PEB_LDR_DATA64;PEB_LDR_DATA64 = packed recordLength:ULONG; //4ByteInitialized:BOOLEAN; //1ByteReserved1: array [0..2] of Byte; //3Byte 补3字节填充跟前面一起凑成8字节SsHandle:ULONG64; //8ByteInLoadOrderModuleList:LIST_ENTRY64; // PVOID64InMemoryOrderModuleList:LIST_ENTRY64;InInitializationOrderModuleList:LIST_ENTRY64;EntryInProgress:ULONG64;end;{32位}PPEB = ^PEB;PEB = packed recordReserved1: array[0..1] of Byte;BeingDebugged: ByteBool;Reserved2: Byte;Reserved3: array[0..1] of Pointer;Ldr: PPEB_LDR_DATA; //PointerProcessParameters: PRTL_USER_PROCESS_PARAMETERS;Reserved4: array[0..103] of Byte;Reserved5: array[0..51] of Pointer;end;{64位}PPEB64 = ^PEB64;PEB64 = packed recordInheritedAddressSpace : UCHAR; //1 ByteReadImageFileExecOptions : UCHAR;BeingDebugged: UCHAR;BitField: UCHAR;Reserved1:DWORD; //因为64位系统是8字节对齐,所以补4位,跟前面4个uchar一起凑成8字节 Mutant:ULONG64; //编译器问题,VC++不用补位,实测VS2017,VS2015中编译器貌似会自动填充对齐ImageBaseAddress: ULONG64;Ldr:PVOID64; //PPEB_LDR_DATA64; //ULONG64;ProcessParameters:PVOID64;//PRTL_USER_PROCESS_PARAMETERS64; // ULONG64;SubSystemData: ULONG64;ProcessHeap: ULONG64;FastPebLock: ULONG64;AtlThunkSListPtr:ULONG64;IFEOKey: ULONG64;CrossProcessFlags: ULONG64;UserSharedInfoPtr: ULONG64;SystemReserved: ULONG;AtlThunkSListPtr32:ULONG;ApiSetMap: ULONG64;end;
Delphi中32位64位程序在64位系统下各数据类型占用字节统计如下:
具体字节对齐填充原理可以参考此连接:
32位源码编译64位程序时的字节对齐问题
原创文章,转载请注明出处!谢谢
Windows 32、64位系统编译器各数据类型大小和字节对齐关系相关推荐
- 为什么在64位系统中指针的大小是8,而32位系统中却是4?
为什么在64位系统中指针的大小是8,而32位的却是4? 64位系统,这个位数指的是CPU 里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,所以: sizeof(double * ...
- 32/64位系统支持多大内存
32/64位系统支持多大内存 自从win7系统之后,大家在安装系统或应用时,就又多了一个需要关注的选项,版本!这个版本不仅仅指的是家庭版.教育版.旗舰版.企业版.专业版这些版本,还包括了另外两个词,3 ...
- 32和64位系统各内置类型所占字节大小(int char long double 指针等)
指针大小不一样主要原因在于:32位的寻址空间是2^32, 即32个bit,也就是4个字节.同理64位编译器 32/64位操作系统,数据类型字节数对比 32/64位操作系统,数据类型字节数对比 32位 ...
- 五种方法安装Windows 7 64位系统
安装64位硬件要求: 一.安装64位位操作系统的CPU的要求: 安装64位位操作系统首先CPU必须支持64位操作系统,目前来看AMD的CPU必较好确定.只要是针脚是939.940,938,1207的C ...
- 关于Windows 7 64位系统 HP M1319f 打印机无法扫描的解决办法
此办法主要针对Windows7 64位系统的用户,对于Xp系统或者Windows8系统没有验证. 笔者在将电脑重装成win7 64位系统后在安装hp打印机驱动的时候打印机自带的驱动盘提示不支持64位系 ...
- Windows 7 64位系统上搭建Hadoop伪分布式环境(很详细)
在开始配置前,我们先了解Hadoop的三种运行模式. Hadoop的三种运行模式 独立(或本地)模式:无需运行任何守护进程,所有程序都在同一个JVM上执行.在独立模式下测试和调试MapReduce程序 ...
- 安装 Windows 7 64位系统 相关注意事项
BIOS 设置 打开 Launch CSM 关闭 Secure BOOT U盘工具制作 UltraISO 软件 格式化为 FAT32 USB-HDD+ 模式 菜单 -> 启动 -> 写入硬 ...
- Windows 10 64位系统下Neo4j安装教程(2021.1.13)
Win 10安装Neo4j图数据库 1.Neo4j简介 2.Neo4j安装 2.1 查看安装好的JDK版本 2.1.1 JDK 11下载与安装 2.1.2 JDK8和JDK11共存 2.2 安装Neo ...
- Python- exe应用程序在Windows Server2012 64位系统运行报错
1.Python 打包成exe程序后运行报错,如图: 解决办法: 1.安装更新包Windows8.1-KB2919442-x64.msu 2.安装更新包Windows8.1-KB2919355-x64 ...
最新文章
- pythonmysql数据库系统实战_Python实战之MySQL数据库操作
- 高通平台:USB充电
- vi/vim基本使用方法
- Boost:同步化的测试程序
- 使用Spring跟踪应用程序异常
- Java Socket实现客户端服务端之间的通信
- c++ primer plus中文版_如何成为一名厉害的C/C++程序员?
- 智能会议系统(5)---SipDemo
- Pandas入门教程(三)
- convenient functions in numpy
- (已解决) centos6.5 yum源 失效 The whole CentOS 6 is dead and shouldn’t be used anywhere at all
- 有道词典在谷歌Chrome浏览器中无法取词的解决方法
- 【小5聊】重装系统之台式电脑BIOSTAR映泰主板,启动U盘PE系统以及重装后无法启动情况
- 虚拟仿真实验项目所需服务器,工程结构虚拟仿真实验室
- u盘有病毒怎么办?修复U盘,3个方法解决
- cs架构自动化测试工具选型
- 周末加班,中午吃饭时看到了马总的一条新闻
- 英国加入亚投行是顺从中国还是想玩无间道?
- Win下VS2019配置PCL点云库总结
- 快速检查局域网内网络延迟
热门文章
- Python数据分析师养成记
- (2022)情人节送小仙女什么礼物?Python对口红进行数据分析,那个女孩子会拒绝这样精心挑选的礼物~
- oracle RAC环境 1521端口NAT映射后,端口能通,数据库报ORA-12541
- 定时器Timer--追赶可执行性
- 公众号文章中怎么添加承诺书附件下载?
- React antd Table 实现单元格点击 表头斜线分组等功能
- 黑魂四(基于java文字游戏打怪)
- Proteus8.9 VSM Studio GCC编译器仿真STM32F407ZGT6系列012_lcd1602一线屏
- android代码调用相机,Android如何调用系统相机拍照
- Power Automate:快速从SharePoint列表中读取数据