编写软件时 64 位优于 32 位的优势

Benefits of 64 bit over 32 bit when writing software

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

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

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

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

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

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;
}

Q: What do you think will be printed on a 32-bit machine vs. a 64-bit machine?

A: A very different result!

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

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

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

Then, what do I get ? Any benefits?

这取决于您要做什么。如果您的程序 永远不会 达到 32 位 CPU 的限制,那么您不一定会看到构建 64 位 [=] 的任何好处51=],并且根据 CPU 和 OS,您实际上可能会看到性能下降(就像早期 64 位 [=51= 上的 32 位仿真的情况一样) ]'s),但对于现代内核和 OS's,这对于 "average" 程序来说基本上不是问题(除了您无法访问超过 4GB 的 RAM 这一事实)。

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

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

For example, Google Chrome right now is unsupported in 32 bit, but not in 64 bit. Which could be the reason?

只有 Chrome team 可以具体告诉你为什么要这个,但我的猜测与几个原因有关。

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

第二个原因可能与内存有关; Chrome 的 64 位版本可以访问超过 4GB 的 RAM(假设系统有更多),因此具有 8GB RAM 的 64 位机器将能够处理更多的浏览器会话并且可能更多比在 32 位机器上更灵敏(对各个会话)。

此外,Wiki 有一个非常好的页面,其中详细介绍了 32 位到 64 位的转换以及各种注意事项,如果您有兴趣深入了解更多差异。

希望能帮到你。

在大多数'significant'程序中,用于数据的内存远远超过用于代码的内存。 32 位 'Hello World' 受益于仅需要 32 位指针、略微更好的代码密度等。但实际上,数据集 - 现在正在谈论 游戏 - 需要访问超过 4GB 限制。

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

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

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


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


This makes me to think the all software packages of some Linux distro written for 32 bit could be ported to 64 bit machine without to do anything change.

经验却恰恰相反。多年来,人们一直在对整数类型大小、指针运算等进行断言,这引起了很多麻烦。我的意思是错误。更强调可移植类型(C99 的 intX_t)和 ABI 问题意识,例如 long int