64位程序,最大优势是可以使用的进程地址空间(即虚拟内存)可以达到2^64,(注意:实际上在X86 64位架构上,实际地址为48位),
而在32位机器上,windows默认是用户可使用2GB地址空间(用户),另外2GB属于操作系统使用(内核os),在Linux下则是3GB(用户),1GB(os).
由于现代程序进程常常需要使用很大地址范围,因此,2GB通常是不够的(在windows下,有的系统如2000server,通过向启动配置添加 /3GB 开关并使用 /LARGEADDRESSAWARE 开关重新链接应用程序,可以将这种平衡调整为 3GB 用户空间和 1GB 内核空间。但,本人windows XP系统 试过2次,结果蓝屏告终,建议不要轻易尝试这个,后果自负)。
windows下程序需要从32位迁移到64位程序基本步骤
- (1)区别程序数据类型
| 类型 | 32位 | 64位 |
| char | 1 | 1 |
| short | 2 | 2 |
| int | 4 | 4 |
| long | 4 | 8 |
| WORD | 2 | 2 |
| DWORD == unsigned long | 4 | 8 |
| void*(指针类型) | 4 | 8 |
| __int64 | 8 | 8 |
| size_t == unsigned int | 4 | 8 |
| SIZE_T == unsigned long | 4 | 8 |
| float | 4 | 4 |
| double | 8 | 8 |
| long long | 8 | 8 |
因此,在基本数据类型中,实际只有long 和指针类型发生了变化。
| 操作系统 | 默认用户空间大小 |
|---|---|
| Windows x86-64 | 8192GB |
| Windows Itanium | 7152GB |
| Linux x86-64 | 500GB |
| Linux PPC64 | 1648GB |
| Linux 390 64 | 4EB |
- (2)检查程序
程序中,凡使用了DWORD,long,SIZE_T,指针字节长度发生变化的,都需要注意了
特别注意 sizeof(),这个运算符号。
结构体:结构体有个对齐方式,可以通过编译指令设置,也可以在工程中设置。
windows,vc编译器下:
#pragma pack(字节数),
#pragma pack(),如果里面任何字节数,表示使用编译器默认对齐方式。
gcc下:
__attribute__ ((aligned (字节位数)));
通常,32位程序升级到64位,出错的地方在于读写文件,比如读写一个long或者其扩展的类型(DWROD,SIZE_T,UNIT_PTR等等),读写一个指针。
- (3)编译调试运行,OK了
64位程序迁移
本文介绍了32位程序向64位迁移的过程及注意事项。详细对比了不同数据类型的位宽变化,并提供了操作系统对用户空间大小的支持情况。还讨论了结构体对齐方式的设置方法,以及常见错误案例。
941

被折叠的 条评论
为什么被折叠?



