为什么制作一个64位版本的程序会很困难?


29

在我的短时间编程中,只要我有程序的完整源代码,就可以为32位或64位计算机编译我的任何C ++,Java等都是很简单的。

但是很多软件没有发布64bit。最令人讨厌的是,还没有64位版本的Unity引擎。

是什么使得很难为64位计算机编译某些程序?


57
因为愚蠢的程序员一直假设sizeof(int)==sizeof(void*)
棘手怪胎2015年

16
在我们的环境中,最重要的原因是依赖于某些第三方组件,这些组件不能作为64位使用。不知道这是否也适用于Unity,但是如果是这样,我也不会感到惊讶。
布朗

他们可以使用int,float,int的int32,int64之类的typedef代替假定其大小。这可能会解决很多问题。许多问题从我们开始假设的时间开始。
Kshitij 2015年

实际上,这是对平面架构的完全合理的假设。Windows故意弄错了,以免破坏自己的螺丝钉。
2015年

3
为什么这是一个合理的假设?我希望可以有一个不错的operator*选择int,但是指针并不需要。而且,大多数Linux和Unix环境也具有int32位。
MSalters 2015年

Answers:


61

通常的问题是,在程序中对未记录的假设进行编码非常容易,而很难找到进行这些假设的位置。高级语言倾向于使我们与这些问题有所隔离,但是在用于实现平台和服务的低级语言中,很容易做到不一定跨架构移植的事情:

  • 假设它int足够大以存储指针

  • 假设指针表示的属性,例如,用于指针标记

  • 假设数据指针和代码指针的大小相同

还存在发行管理的实际问题。如果我仅进行x86构建,它仍将在x86-64上运行,尽管由于寄存器的可用性有限可能会更慢。如果我同时针对x86和x86-64进行构建,则现在必须在两种体系结构上进行测试,并处理可能只在一种体系结构上出现的错误,从而增加了发布新版本的成本。


10
请注意,有可能编写只在64位版本的OS上运行x86二进制文件时才会出现的错误。只是更难了;-)
史蒂夫·杰索普

6
+1。我想在“发布管理”中添加以下内容:如果我的软件依赖于第三方组件,即使有特定组件的32位和64位版本可用,测试新版本也要付出额外的努力不应低估。因此,恕我直言,发布管理应该是清单上的第一要点,而不仅仅是旁注。
布朗

您能详细说明int指针大小问题吗?是因为在64位环境中,内存空间会比int允许的空间大吗?
TankorSmash

4
@TankorSmash:在x86上正常sizeof(int) == sizeof(void *)(它们都是32位);在x86_64上,通常保留int32位(它与x86兼容并避免浪费内存空间),但是指针必须为64位(因为虚拟地址空间最多为2 ^ 64),因此它们不再可用推入int或推unsigned int
Matteo Italia

26

当针对32位和64位Intel / AMD架构进行编译时,大多数软件都可以正常工作。但是,某些软件不会。除了懒惰或扩大受众范围外,还有一些特定原因导致重新编译为64位将无法正常工作。

  • 软件可能使用不安全的指针操作。也许程序会将一个指针放到一个int中,对于大多数C和C ++编译器而言,它通常是32位。指针是64位程序中的64位。那行不通。

  • 如果使用的整数类型大小不同,则移位操作可能会产生不同的结果。当使用常规数据类型而不是标准typedef时,这可能是一个问题int32_t

  • 联合中使用的数据类型可能会更改大小,从而改变联合的行为。

  • 软件可能只依赖32位的库。通常,由于有关栈,指针等的假设,64位程序只能与64位库一起使用。

您在问题中询问的困难仅在于,在某些代码库中,可能存在数百万行代码,这些代码执行不安全的操作,做出不安全的假设,具有开发人员设置的捷径和巧妙的“优化”。该代码将无法在64位环境中进行编译,或者将进行编译,但会出现show-stopper错误。解决所有问题可能需要很长时间。也许一家公司会逐步修复它们,直到可以发布64位版本为止。也许一家公司将与当前的维护版本一起开发“版本2”,因为有必要进行完全重写。

这个故事的寓意是编写简洁的代码,不要试图second测编译器或添加不需要的聪明的优化,否则可能会破坏软件,并且可能仍然无济于事。

本文所涉及的内容远远超出我希望包含在此答案中的范围:在64位平台上移植C ++代码的20个问题


8
这些问题也可能不仅限于编译。我有一个音乐人朋友,他们无法使用可用的64位FL Studio,因为他们需要许多只有32位的VSTi。其他基于动态链接的插件体系结构也受到类似的影响。
StarWeaver 2015年

感谢您的编辑:我通常对语法非常挑剔,但犯了一些错误。还有@StarWeaver,我想我在说代码可以编译但有bug时就提到了这一点。这仍然可以追溯到我为目标语言和平台编写简洁代码的观点。

“有显示阻止程序错误”显示阻止程序很明显,并且“在您的脸上”可以解决。我认为可能更糟糕的是,所有产生微妙不正确结果的问题将在很长一段时间内不会引起注意。
Burhan Ali
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.