compiler-construction - 为什么制作 64 位版本的软件这么难?

标签 compiler-construction 64-bit 32bit-64bit

在将您的软件设计到 64 位环境中时必须考虑的所有方面是什么,为什么相同的代码不能像 32 位和 64 位(在谈论应用程序时)一样工作?

驱动程序显然是一个不同的野兽,缺少 64 位驱动程序是几乎所有硬件的臭名昭著的问题。这个领域有什么不同,以至于几乎不可能找到驱动程序?

为什么制作 64 位版本的软件这么难?

编辑:让我们忘记带有魔数(Magic Number)等的旧软件的基本缺陷,并认为您会自己创建软件,以与两者兼容。您需要考虑哪些方面,是否存在当前编译器设计无法克服的问题? 64 位软件的全部缺失不能仅仅因为人们喜欢带有魔数(Magic Number)的代码?! :)

结论 : 好像都是人的懒惰和历史原因,而不是技术原因。

最佳答案

这可能很难的一个具体原因是指针大小会有所不同。指针现在占用 64 位,而不是占用 32 位的指针。

如果某处的软件将指针硬塞进 int,这就是一个问题。通过 reinterpret_cast在 C++ 中(这可能会出现在一些非常低级的代码中),它碰巧能工作,因为 int 的大小和一个指针大小相同。基本上,代码假定指针具有特定大小。

另一种可以反击的方法是,如果代码中充斥着像 4 这样的神奇数字。而不是 sizeof(void*) , 或 0xffffffff而不是 INT_MAX或类似的东西。

如果软件依赖于 64 位不可用的库或函数,则可能没有 64 位版本的软件。您不能拥有由 32 位和 64 位组成的应用程序。例如,在 Windows 中,有一个名为 SetWindowLong 的函数。它只能接受 32 位数据,因此如果需要将指针传递给函数,它对于 64 位程序不是很有用。这就是为什么有一个函数叫 SetWindowLongPtr 在 64 位程序中最多可以处理 64 位,在 32 位程序中最多可以处理 32 位。

请注意,即使在 64 位 Windows 上,Internet Explorer 默认在 32 位上运行,因为它的绝大多数插件仅在 32 位中可用。一个很好的例子是 the Adobe Flash Player ,仅在 32 位中可用。因此,显然即使对于像 Adob​​e 这样的大公司,为 64 位移植可能并不总是微不足道的。

位移操作可能会受到影响。例如,位移 0x80000 32位左10次给你0x0 , 但位移 0x80000 64位左10次给你0x200000000 .

尽管如此,将应用程序移植到 64 位太困难并没有真正的技术原因 如果代码写得好。 最好的情况是只需要简单的项目重新配置和完整的重建。

我愤世嫉俗的一面说,公司将此作为实现计划报废的一种方式 - 强制或鼓励人们升级/购买最新产品!

关于compiler-construction - 为什么制作 64 位版本的软件这么难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3629336/

相关文章:

c - 为什么简单的程序会占用这么多的存储空间?

c++ - Windows 上的 LALR(1) 或 GLR - 当前的 Bison++/Flex++ 替代品?

compiler-construction - LR(1) 但不是 LL(1) 的语法

linux - 使用 gcc 编译 64 位 linux 内核

c++ - 哪种整数数据类型最有效地使用 x64 CPU 内核?

windows - 为什么Windows在新的x64进程中使用RCX、RDX作为指针,与新创建的32位进程中的EAX、EBX不同?

compiler-construction - 这个产生式规则是否左递归?

java - 在 Java 中,为按位运算假设一定大小的基本类型是否安全?

c++ - 如何解决 GMP 的 32 位和 64 位库之间的冲突?

windows - 请注意 Windows 8.1 注册表读取虚拟化不适用于 64 位应用程序