【问题标题】:Benefits of 64 bit over 32 bit when writing software [duplicate]编写软件时 64 位相对于 32 位的优势 [重复]
【发布时间】:2016-07-03 06:10:47
【问题描述】:

如果我有一个像 HelloWorld 这样用 C++ 编写的简单程序,然后我在 32 位和 64 位机器上编译它,我会得到两个不同的二进制文件,但它们是不同的机器代码,只有 32 位二进制文​​件会能够在 32 位或 64 位机器上运行。

在这两种情况下我都没有任何好处,因为源代码是相同的,而且它们的作用相同。这让我觉得一些为 32 位编写的 Linux 发行版的所有软件包都可以移植到 64 位机器上,而无需做任何更改。那么,我得到什么?有什么好处吗?

是否有任何 C/C++ 代码示例,我可以在 64 位中执行一些我在 32 位中无法执行的代码?

例如,Google Chrome 目前不支持 32 位,但不支持 64 位。可能是什么原因?

【问题讨论】:

  • @JamesRoot 在 64 位中越界访问
  • 每天我都面临着由于多种原因无法将成熟的大型应用程序移植到 64 位的痛苦。与您的“Hello world”程序不同,该程序包含大约 50 万行代码,编写时间为 10 年。您认为代码可以简单地“移植到 64 位”而没有任何后果的假设是不正确的。
  • Chrome 仅在其中一个上受支持的原因是,Google 不必费心确保它们都能正常工作。
  • Is there any example of code in C/C++ that I can do some in 64-bit that I can't do in 32-bit? 不。所有的计算机体系结构都是图灵完备的,只要有足够的时间和内存,就可以做任何其他图灵完备的系统可以做的事情

标签: c++ c native 32bit-64bit


【解决方案1】:

32 位和 64 位 CPU 之间存在太多差异(内存处理、CPU 体系结构、总线等),但最大和最明显的差异是可寻址内存(即您的指针可以走)。

以如下代码为例:

#include <iostream>

int main(int argc, char* argv[])
{
    // this is just to demonstrate 32 vs. 64
    int* x = (int*)0xFFFFFFFFFFFFFFFF;
    int* y = (int*)0x00000000FFFFFFFF;
    std::cout << std::hex << 
        "&x = " << x << std::endl <<
        "&y = " << y << std::endl;
    if (y == x) {
        std::cout << "RIGHT!" << std::endl;
    } else {
        std::cout << "WRONG!" << std::endl;
    }
    return 0;
}

问:您认为 32 位机器和 64 位机器会打印什么?

答:一个非常不同的结果!

从上面的代码可以看出,如果我期望 x 等于 y 并在 32 位机器上进行测试,那么一切都会如我所愿,我的代码将运行良好,每个人都很开心!但是后来我把这段代码传给了一个朋友,他必须为他们的 64 位机器重新编译,他们肯定很高兴,因为他们看到的只是WRONG!

我不会深入探讨 32 与 64 的其他差异(如设备和系统驱动程序,或内核模块),因为它超出了本论坛的范围,但希望上面的代码可以说明为什么构建 32位机器,然后为 64 位机器重新编译并不像最初想象的那样简单。

所以更直接地回答你的一些问题:

那么,我得到了什么?有什么好处吗?

这取决于你想要做什么。如果您的程序永远不会达到 32 位 CPU 的限制,那么您不一定会看到为 64 位 CPU 构建的任何好处,并且取决于 CPU 和操作系统,您实际上可能会看到性能下降(就像在 64 位 CPU 上进行 32 位仿真的早期情况一样),但是对于现代内核和操作系统,这对于“普通”程序来说基本上不是问题(保存您不能访问超过 4GB 的 RAM)。

但是,如果您的项目会消耗大量内存(例如网络浏览器),或者需要对非常大的数字集进行计算(例如 3D 计算),那么您肯定会从中受益事实上,您可以为 64 位构建解决超过 4GB 的 RAM 或更大的分辨率数字。

这仅取决于您的项目范围以及您愿意支持的架构。

例如,Google Chrome 目前不支持 32 位,但不支持 64 位。可能是什么原因?

只有Chrome team 可以明确告诉你为什么会这样,但我猜有几个原因。

首先是 32 位 CPU 在很大程度上正在消亡的事实,因此取消对垂死架构的支持意味着他们可以专注于改进 64 位架构。

第二个原因可能与记忆有关; 64 位版本的 Chrome 可以访问超过 4GB 的 RAM(假设系统有更多),因此具有 8GB RAM 的 64 位机器将能够处理更多的浏览器会话并且可能响应更快(对单个会话)而不是在 32 位计算机上。

此外,Wiki 有一个相当不错的页面,其中详细介绍了 32 位到 64 位的转换以及各种注意事项,如果您有兴趣深入了解这些差异。

希望能有所帮助。

【讨论】:

    【解决方案2】:

    在 x64 平台上,64 位计算可以比 32 位更快。 64 位程序也可以使用更多 RAM(不受 4 Gb 限制)。

    【讨论】:

      【解决方案3】:

      在大多数“重要”程序中,用于数据的内存远远超过用于代码的内存。 32 位“Hello World”受益于仅需要 32 位指针、略高的代码密度等。但实际上,数据集 - 以及如今正在讨论的游戏 - 需要超过 4GB 限制的访问权限。

      您今天可能甚至不会购买新的 4GB 桌面级显卡。如果您对集成显卡不满意,您可能不会获得板载小于 8GB 的​​ GPU。

      努力为x32 ABI 提供Linux 内核和用户空间支持,它利用x86-64 ISA,但本质上使用32 位指针;而且理论上4GB的数据限制对于很多程序来说已经绰绰有余了。但是由于代码密度(缓存)带来的速度优势并不令人信服,也不能证明在 另一个 ABI(和并行库/加载器)以及 x86- 64 和 IA32 ABI。更不用说代码维护了。成本效益比只是没有加起来。

      应该注意的是,x86 指令编码具有不同的字节长度编码,当早期的 RISC 架构看起来要统治世界时,这被认为是神秘的,但实际上已经对其有利。


      这个想法的一个更成功的实现是用于 MIPS (RISC) 架构的 N32 ABI。特别是对于 90 年代后期的 SGI 硬件。 PowerPC64 也可以在 32 位模式下使用 64 位指令。但是 PPC 从一开始就设计为可扩展到 64 位 IIRC,尽管最初的实现只支持 32 位 ISA。


      这让我觉得一些为32位编写的Linux发行版的所有软件包都可以移植到64位机器上而无需做任何改变。

      经验实际上揭示了相反的情况。多年来,人们一直在断言整数类型大小、指针算术等,这引起了很多麻烦。我的意思是错误。例如,对于可移植类型(C99 的 intX_t)和对 ABI 问题的认识,例如 long int

      【讨论】:

        猜你喜欢
        • 2011-09-07
        • 2018-03-27
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        相关资源
        最近更新 更多