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了