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
优势分析:
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/