Win32 -> Win64移植

本文探讨了64位系统如Intel64相较于32位系统的优势,包括更大的内存支持、更高效的函数调用及性能提升。同时也讨论了32位程序在64位系统上的性能损失、架构限制等问题,并提供了向64位迁移的具体步骤。
摘要由CSDN通过智能技术生成
AI-64和Intel 64.目前普遍的是intel 64
优势分析:
1.可以使用更多的内存。理论上可以使用2^64内存。不过目前的intel64仅仅是数据总线增加到了64位,实际的cpu支持40位。通过构架设计可以最多2^52.根据不同的操作以系统而定
2.函数调用上,函数参数少于4个的会比32系统更加高效。因为函数调用的前四个参数是使用增加的RCX,RDX,R8,R9四个寄存器来传递的,而不是栈。
3.基本上重新编译的32位程序(不做任何优化,编译成64位程序),会有5%-15%的性能提升(CPU频率相同情况下,因为以上原因,还有寄存器的增加导致的运算能力增加)
劣势分析:
1.32位程序运行在64系统上,会比32位系统上增加额外的2%性能损失(AI-64构架的wow64系统上会损失更多。因为cpu指令集也需要模拟),主要是模拟对于I/O的操作(地址),还有寄存器的操作。比如把%SYSTEM%\System32\xxx.dll转换成%SYSTEM%\SysWow64\xxx.dll
2.


限制:
1.wow64不支持16位程序的运行
2.wow64不支持内核态编译的32位程序运行


步骤和细节


1.VS2008 安装x64compile tools,如果安装了SP1的需要全部卸载VS2008更新后才能启动安装


2.一些函数的size_t和 <<移位操作会产生问题


3. size_t、pointer


a << si
len = sizeof()
len = vecotr.size()


printf("%d", sizeof(xx)) 也要出问题了
printf("%d", pointor*)
scanf或者sprintf就导致了内存溢出


for(unsigned int i < size_t; size_t; i++)
{
}
可能导致死循环


pointer与int,unsignedint 相互转换导致溢出


操作:所有的size_t返回的内容,赋值全部都有warning.对warning 进行相应的处理.所有的size_t全部转换成了_U32进行处理。默认认为所有的长度和内存大小都不会超过_U32
4.默认栈大小设置位原来的2-3倍,防止肯定出现的问题


5.嵌入式汇编有麻烦了
vs 64位根本不支持。c重写吧,或者使用MASM写了以后链接


6.检查是否存在魔术字,特别是大小相关的......这个相当不好弄呢


7. << >>操作,的溢出问题




8.值与point之间的隐式转换可能存在无符号到有符号的问题,导致内存溢出
unsigned int -> pointer (int 32位, int64 64位) 
int A = -2;
unsigned B = 1;
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
ptr = ptr + (A + B); //Invalid pointer value on 64-bit platform
printf("%i\n", *ptr); //Access violation on 64-bit platform


8.itanium不支持无aligned 会exception;需要使用UNALIGNED关键字,显示说明
#pragma pack (1) // Also set by key /Zp in MSVC
struct AlignSample {
  unsigned size;
  void *pointer;
} object;
void foo(void *p) {
  *(UNALIGNED void *)&object.pointer = p; //Very slow

}


参考:http://www.viva64.com/en/l/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值