构建64位版本的二进制文件有什么大不了的?

时间:2020-03-06 15:00:06  来源:igfitidea点击:

有大量的驱动程序和著名的应用程序没有64位可用。例如,Adobe不为Internet Explorer提供64位Flash Player插件。因此,即使我运行的是64位Vista,也必须运行32位IE。 Microsoft Office,Visual Studio也不随64位AFAIK一起提供。

现在,就我个人而言,在64位上构建我的应用程序并没有太多问题。我只需要记住一些经验法则,例如始终使用SIZE_T而不是UINT32作为字符串长度等。

所以我的问题是,是什么导致人们无法构建64位?

解决方案

只是一个猜测,但我认为其中很大一部分会得到支持如果Adobe编译64位版本,则他们必须支持它。即使这可能只是一个简单的编译开关,他们仍然必须进行大量测试等,然后训练他们的支持人员正确响应,当他们遇到问题时要解决这些问题,或者会导致新版本的32位二进制代码或者代码中的分支等。因此,尽管看上去很简单,但对于大型应用程序而言,最终仍然会花费很多。

他们的Linux / Flash博客以某种方式解释了为什么现在还没有64位Flash Player。有些是特定于Linux的,有些则不是。

主要是支持和质量检查问题。对于大多数代码而言,为64位构建的工程工作相当琐碎,但是测试工作和支持成本却无法以相同的方式缩减。

在测试方面,即使我们"知道"它们应该通过,我们仍然必须运行所有相同的测试。

对于许多应用程序,转换为64位内存模型实际上没有任何好处(因为它们永远不需要多于GB的RAM),并且由于指针大小较大,实际上会使事情变慢(使每个对象字段的大小是原来的两倍)。

加上缺乏需求(由于鸡肉/鸡蛋问题),我们可以了解为什么对于大多数开发人员而言,这样做是不值得的。

如果我们是从头开始的,那么64位编程并不难。但是,我们提到的所有程序都不是新的。

从头开始构建64位应用程序要比从现有代码库移植要容易得多。移植时有很多陷阱,尤其是当我们进入已经进行了某种程度的优化的应用程序时。程序员使用许多小的假设来提高速度,而这些假设并不总是很容易快速移植到64位。我不得不处理的一些示例:

  • 结构中元素的正确对齐。随着数据大小的变化,假设结构中的某些字段将在最佳内存边界上对齐的假设可能会失败
  • long整数的长度会发生变化,因此,如果我们通过套接字将值传递给可能不是64位的另一个程序,则需要重构代码
  • 指针长度发生了变化,因为很难解读编写的代码,这使公司变得难以调试。
  • 底层库也将需要64位支持才能正确链接。如果我们依赖于任何非开源的库,则这是移植代码问题的很大一部分

这并不像在编译器上切换开关那样简单。至少,如果我们想做对的话,那不是。最明显的例子是我们需要使用64位数据类型声明所有指针。如果我们有任何代码可以假设这些指针的大小(例如,一个数据类型为每个指针分配4个字节的内存),则需要对其进行更改。所有这些都需要在我们使用的任何库中完成。此外,如果我们只错过了一些,那么最终将导致指针向下投射并放置在错误的位置。指针不是唯一的症结,但肯定是最明显的。

除了@jvasak帖子中的内容外,还可能导致错误的主要内容:

  • 指针大于整数-大量的代码假设大小相同。

请记住,除非将它们特别标记为" LARGE_ADDRESS_AWARE",否则Windows甚至将不允许应用程序(无论是32位还是64位)处理地址大于0x7FFFFFFF(2GB或者更高)的指针,因为如此多的应用程序在某些时候将指针视为负值并掉落。

许多公司没有努力创建64位版本的另一个原因是,他们根本不需要这样做。

Windows具有WoW64(Windows 64位是Windows),Linux可以将32位库与64位一起提供。两者都使我们能够在64位环境中运行32位应用程序。

只要软件能够以这种方式运行,就没有很大的动力来转换为64位。

例外情况是设备驱动程序之类的事情,因为它们与操作系统之间的联系更加紧密,并且无法在基于x86-64 / AMD64的64位操作系统提供的32位层中运行(IA64无法从我明白)。

我在Flash Player上与我们同意,但是我对Adobe尚未安装此产品感到非常失望。正如我们所指出的,它不能在64位上正常运行,这要求我们运行32位版本的Internet Explorer。

我认为这对Adobe来说是一个战略性错误。对于Flash Player而言,必须运行32位浏览器是给用户带来的不便,而且许多人不会理解该解决方案。这可能会导致开发人员对使用Flash感到担忧。对于网站而言,最重要的事情是确保每个人都可以查看它,而疏远用户的解决方案通常不是受欢迎的解决方案。 Flash的受欢迎程度是由它自己的受欢迎程度决定的,使用它的站点越多,在其系统上使用它的用户就越多,在其系统上使用它的用户越多,愿意使用它的站点就越多。

零售市场推动了这些事情的发展,当普通消费者购买一台新计算机时,他们不会知道他们不需要64位操作系统,或者会得到它,因为他们听说这是最新的并且最重要的事情,是计算的未来,或者仅仅是因为他们不知道区别。

Vista已经发布了大约2年,而Windows XP 64位在此之前已经发布了。在我看来,对于Flash等主要技术来说,如果他们想保留自己的市场,那就太久了。这可能与Adobe接管Macromedia有关,这表明Adobe并不认为Flash是他们未来的一部分,我很难相信,因为我认为Flash和Dreamweaver是他们脱离Macromedia的主要部分,但是为什么他们还没有更新呢?

我将C / C ++代码移植到64位时遇到的最大问题是来自第三方库的支持。例如。当前只有32位版本的Lotus Notes API和MAPI,因此我们甚至无法针对它们进行链接。

另外,由于我们无法将32位DLL加载到64位进程中,因此我们再次尝试动态加载内容时会被烧坏。我们再次遇到此问题,试图支持64位以下的Microsoft Access。从维基百科:

The Jet Database Engine will remain
  32-bit for the foreseeable future.
  Microsoft has no plans to natively
  support Jet under 64-bit versions of
  Windows