为什么制作64位版本的软件如此困难?

Tum*_*oid 6 compiler-construction 64-bit 32bit-64bit

在将软件设计到64位环境时,必须考虑哪些方面,以及为什么相同的代码不能像32位和64位(在谈论应用程序时)?

驱动程序显然是一个不同的野兽,缺少64位驱动程序是几乎所有硬件的臭名昭着的问题.在该领域有什么不同,几乎不可能找到驱动程序?

为什么制作64位版本的软件如此困难?

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

结论:似乎完全是关于人类懒惰和历史原因,而不是技术原因.

In *_*ico 14

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

如果某个地方的软件在C++中指向一个intvia a指针reinterpret_cast(这可能出现在一些非常低级别的代码中),这就是一个问题,并且它碰巧工作,因为一个int和一个指针的大小是相同的大小.基本上,代码假定指针具有一定的大小.

另一种可以反击的方法是,如果代码中充满了魔法数字,4而不是代替sizeof(void*)0xffffffff代替INT_MAX类似的东西.

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

请注意,即使在64位窗口上,Internet Explorer也默认运行32位,因为绝大多数插件只能以32位的形式提供.一个很好的例子是Adobe Flash Player,它只有32位.因此,显然即使对于像Adobe这样的大公司来说,移植64位也许并不总是微不足道.

Bitshifting操作可能会受到影响.例如,0x8000032 位的位移左移10次就可以了0x0,但是0x8000064位的位移10次​​就可以了0x200000000.

所有这一切,没有真正的技术原因,如果代码写得很好,将应用程序移植到64位是非常困难的.最好的情况是只需要一个简单的项目重新配置和完全重建.

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


Chu*_*uck 5

简而言之:在最流行的语言家族 - C 及其子语言中 - 数据类型的大小和结构非常重要并且由实现定义。事实上,C 有很多依赖于实现的特性。这意味着编写不可移植的代码很容易。编写不对底层架构做出假设的代码并非不可能,但在尝试在不同环境中运行代码之前,很容易依赖 x86 特定的行为而不会意识到自己做了什么。

主要是这些低级功能使架构独立性变得困难。在 Python 和 C# 等高级语言中,这要容易得多。