在我的短时间编程中,只要我有程序的完整源代码,就可以为32位或64位计算机编译我的任何C ++,Java等都是很简单的。
但是很多软件没有发布64bit。最令人讨厌的是,还没有64位版本的Unity引擎。
是什么使得很难为64位计算机编译某些程序?
operator*
选择int
,但是指针并不需要。而且,大多数Linux和Unix环境也具有int
32位。
在我的短时间编程中,只要我有程序的完整源代码,就可以为32位或64位计算机编译我的任何C ++,Java等都是很简单的。
但是很多软件没有发布64bit。最令人讨厌的是,还没有64位版本的Unity引擎。
是什么使得很难为64位计算机编译某些程序?
operator*
选择int
,但是指针并不需要。而且,大多数Linux和Unix环境也具有int
32位。
Answers:
通常的问题是,在程序中对未记录的假设进行编码非常容易,而很难找到进行这些假设的位置。高级语言倾向于使我们与这些问题有所隔离,但是在用于实现平台和服务的低级语言中,很容易做到不一定跨架构移植的事情:
假设它int
足够大以存储指针
假设指针表示的属性,例如,用于指针标记
假设数据指针和代码指针的大小相同
还存在发行管理的实际问题。如果我仅进行x86构建,它仍将在x86-64上运行,尽管由于寄存器的可用性有限可能会更慢。如果我同时针对x86和x86-64进行构建,则现在必须在两种体系结构上进行测试,并处理可能只在一种体系结构上出现的错误,从而增加了发布新版本的成本。
sizeof(int) == sizeof(void *)
(它们都是32位);在x86_64上,通常保留int
32位(它与x86兼容并避免浪费内存空间),但是指针必须为64位(因为虚拟地址空间最多为2 ^ 64),因此它们不再可用推入int
或推unsigned int
。
当针对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个问题
sizeof(int)==sizeof(void*)