作为一个程序员,我需要什么担心当搬到64位windows?
-
23-08-2019 - |
题
大多数我最近编程上已有32位Windows使用C++/C#/维生素b6.最近,我的客户要求,如果我的代码将上运行的64位的窗口。
我想知道什么是传统功能,我可能被使用,这将打破在64位Windows?什么是一些真实世界的问题我需要考虑和担心的?
显然,我将考验我的代码中的64位的操作系统,但我想知道什么是共同的问题寻找。我更关心的是现有的二进制文件,但我的评论什么要担心当重新编译(尽可能).
编辑:这里是一个 好的名单 64位移植的错误。
解决方案
其他提示
就我而言,一个最重要的事情有关移植C/C++码64位Windows是 测试你的应用程序 MEM_TOP_DOWN
分配启用(AllocationPreference
注册值) 作为描述 4千兆字节的调整:
迫的拨款分配从更高的地址之前,下地址为测试目的,指定
MEM_TOP_DOWN
打电话时VirtualAlloc
或者设置以下注册值0x100000:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference
当做这事?
- 如果你有现有的32位前任,建立与
/LARGEADDRESSAWARE
MSVC接头的选择(或有IMAGE_FILE_LARGE_ADDRESS_AWARE
标志的设置在他们的PE头通过其他手段,例如editbin.exe
),然后他们得到一个完整的4个地址的虚拟空间有64位Windows,你必须试验他们的AllocationPreference
登记册的价值设定的。 - 如果你有现有的32位Dll,可能是装大地址意识到前男友,你必须试验他们的
AllocationPreference
登记册的价值设定的。 - 如果你要重新编译C/C++码进入的64位EXE或DLL,你必须试验它
AllocationPreference
登记册的价值设定的。
如果你C/C++应用程序落入一个这三种类别,你不要测试 MEM_TOP_DOWN
分配、测试是非常不可能赶上任何指截断/符号规范虫子在你的代码。
第二个最重要的事情,如果你使用MSVC和你重新编译C/C++码64位,是 使用 /Wp64
编译器的选择你的 64位 建立:
- 这将导致编译器发警告的类型转化,截断指针或延长小组成的类型为指针,(即使在
reinterpret_cast
或C的样式转换是使用),以及一些其他的64位移植的问题。 - 是的, 文档 说说,而不是编纂与
/Wp64
你应该用一个编译器目标的64位的平台,但这本身不会赶上的指针截断/扩展问题的在编译时间。使用一个编译器目标的64位 和 启用/Wp64
编译器选择的64位的建立将会赶上的许多指截断/扩展问题,在编制时间,这将节省时间的长远目标。 - 不幸的是,与MSVC2008年,这也将产生一个"命令行警告"对于每个单元翻译说的
/Wp64
选项已被否决。我可以看到为什么选择使用为32位的建立(其中它是一个邪恶的黑客,需要注释你的许多类型定义),但这是不幸的,它也是废弃的64位建立(其中它实际上是有用的)。
如果你是在谈论32位程序,那么你必须几乎完全不用担心自Windows 64将运行这些模拟情况下为32位。与将来的Windows版本(视窗e.g 7)的任何问题都可能是不兼容的,而不是问题与64位操作系统。
但是,如果您的托管代码被编译为“任何CPU”的目标平台,您拨打电话到非托管代码(例如PInvoke的),或依赖于其他组件,然后有一些事情要注意的。斯科特Hanselman的帖子有关在x86 / x64的CLR覆盖该和是在CLR的一个很好的解释的Win32 / 64。
当显影64位机程序则编程指南64位Windows 是一个很好的指南。它在很大程度上归结为指针和数据类型的大小:)
32位的程序将运行现在64位的窗口。只要你不做任何装置驱动的发展的课程。
如果你编译软件作为64位软件的第一次,你需要照顾下:
- 一指针是64位,同时int是32位。不存储指针在整数、你的代码会破裂。
- 64位进程需要64位Dll。如果取决于第三部分Dll,确保他们还提供了64位。如果你需要之间的通信的一个32位进程和64位进程中,你会需要一些对许多不同的方式IPC。叫功能直接出的问题。
- 该系统目录上的64位Windows是不同的32位的窗口。如果你有一些硬盘编码的路径,可能需要检查他们了。
如果您出于任何原因,你会遇到麻烦做DLL注入。
从C / C ++透视....
一个明显的是,int的大小将变得8个字节,而不是4个字节。如果您的代码是依赖于你可能会得到意想不到的效果。结构和可变比对可能偏移。您可以使用的#pragma包来克服它,但我不是在比对和包装非常流畅。
如果您使用任何工会与他们整数,该行为可能会改变。
如果使用的是任何位域的结构,基于整数额外的32位可能会引起混淆。符号位也不会,你以为是。
如果你的代码的任何十六进制常量和预期的迹象去负,你可能有问题。例 为0x8000000是负数为日志,或32位的整数。 0x80000000的作为一个64位的平台上的整数是一个正数。直接设置符号位,你将不得不使用0x80000000的00000000(出于可读性嵌入空间只)
此外,我期望size__t适当地生长。如果您正在基于MAX_INT任何分配,他们将大得多。
要避免这些类型大小异常的,我一般坚持使用多头代替整数。
是32位仿真真的防弹?我已经看到,在注册表中奠定了有点不同。我只是想知道什么典型的事情不工作...
另外,在C:\ Windows \ system32目录只能包含64位的DLL。如果你有一个32位的DLL,你需要把它放在C:\ WINDOWS \ SysWow64资料\