编写软件时 64 位相对于 32 位的优势 [重复]

2024-01-08

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

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

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

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


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:您认为 32 位机器与 64 位机器上会打印什么?

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

从上面的代码可以看出,如果我期望的话x等于y并在 32 位机器上进行测试,然后事情就会按照我的预期进行,我的代码将运行良好,每个人都很高兴!但后来我将此代码传递给一位朋友,他必须为他们的 64 位机器重新编译,他们肯定是not很高兴,因为他们看到的只是WRONG!

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

因此,更直接地回答您的一些问题:

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

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

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

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

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

只有Chrome 团队 https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/FoE6sL-p6oU可以具体告诉你为什么要这样做,但我的猜测与几个原因有关。

首先,32 位 CPU 基本上正在消亡,因此取消对即将消亡的架构的支持意味着他们可以专注于改进 64 位架构。

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

此外,Wiki https://en.wikipedia.org/wiki/64-bit_computing有一个非常好的页面,详细介绍了 32 位到 64 位的转换以及各种注意事项,如果您有兴趣深入了解这些差异的话。

希望能有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写软件时 64 位相对于 32 位的优势 [重复] 的相关文章

随机推荐

  • 调用基函数,然后调用继承函数

    我有一个基类和一个继承基类的类 基类有几个虚函数 继承类可以重写这些虚函数 但是 基类中的虚拟函数具有必须在调用继承类重写之前运行的代码 有什么方法可以让我先调用基类虚函数 然后再调用继承的类重写 无需调用base function 我知道
  • 如何从XML文件读取数据并将其存储到数据库(MySQL)中?

    我需要从 XML 文件获取数据并将其存储到 MySQL 数据库中 我正在考虑使用 SAX 解析器来解析数据 但我不确定如何将数据有效地存储到数据库中 我正在考虑一些技术 例如JDBC http en wikipedia org wiki J
  • Python、Selenium 和 Beautiful Soup for URL

    我正在尝试使用 Selenium 编写一个脚本来访问 Pastebin 进行搜索并以文本形式打印 URL 结果 我需要可见的 URL 结果 仅此而已 div class gs bidi start align gs visibleUrl g
  • 监控应用程序对 DLL 的调用

    简而言之 我想监视从应用程序到 DLL 的选定调用 我们有一个旧的 VB6 应用程序 我们丢失了它的源代码 当时公司没有使用源代码控制 此应用程序使用第 3 方 DLL 我想在新的 C 应用程序中使用这个 DLL 不幸的是 DLL API
  • 如果存储过程中参数为空,则选择全部

    我想在 SQL Server 中创建一个过程来选择并连接两个表 参数 company from 和 to 始终被设置 但 serie type 可以为NULL 如果 serie type不为NULL我只想包含指定的类型 简单AND S Ty
  • 我们什么时候应该将 String 更改为 Stringbuilder?

    在应用程序中 字符串是一种常用的数据类型 我们知道 字符串的突变会占用大量内存 所以我们能做的就是使用 StringBuilder StringBuffer 但什么时候我们应该改用 StringBuilder 呢 当我们必须拆分它或替换其中
  • 使用 apache ant 构建时未找到属性“hardwareAccelerated”的资源标识符

    我的应用程序针对 android API 级别 7 2 1 在 Eclipse 下一切正常 生成的 APK 在 2 1 设备上也可以正常工作 我尝试使用 apache ant 构建应用程序并收到此错误 相同问题的所有解决方案都告诉我必须设置
  • YouTube API - 通过播放列表查询获取所有视频的标签

    我正在查询 YouTube 频道以检索播放列表元数据 如下所示 https www googleapis com youtube v3 playlistItems part snippet 2CcontentDetails maxResul
  • getEdgeFlags 总是返回 0?

    为什么我无法获取getEdgeFlags 是否能够检测到边缘触摸 我延长了DrawerLayout 然后做了 Override public boolean onInterceptTouchEvent MotionEvent ev int
  • 有什么方法可以在 Swift 中逐渐加快游戏速度吗?

    我目前正在使用 Spritekit 开发一款游戏 游戏中的物体会在屏幕顶部产生并落向玩家角色 当玩家角色与任何物体碰撞时游戏结束 我正在尝试找到一种方法 随着时间的推移逐渐加快游戏速度 使游戏变得更加困难 即游戏开始时物体以正常速度下落 5
  • php 会话在服务器中存储多长时间?

    我想知道 php 会话在服务器内存中存储多长时间 如果用户登录 在服务器中设置会话变量 并且他使浏览器长时间打开 假设 30 天 并且他在第 31 天重新加载页面 该怎么办 浏览器可以访问会话变量 浏览器仍然有会话cookie 吗 默认 p
  • 如何在 Ubuntu 14.04 上安装 php7 (zts) + pthreads

    我需要完整安装 PHP7 ZTS Pthreads 的帮助 我已尝试以下安装但无法使其工作 sudo i apt get update apt get install y git bison autoconf build essential
  • transformClassesWithJarMergingForDebug,com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:

    尝试在设备上运行应用程序时出现此错误 但是gradle同步总是成功的 错误 任务执行失败 EmployeeManager transformClassesWithJarMergingForDebug gt com android build
  • Chrome/V8 不会垃圾收集循环引用吗?

    看一下 Chrome 堆快照的这一部分 它显示了堆中对象的保留器 据我所知和所见 该对象应该是垃圾 但尽管如此 该对象仍未被收集 毕竟 到根的 最短 路径是一条循环路径 它实际上从未到达根 这让人想知道 快照查看器如何能够为其分配 12 的
  • 使用可用的训练挂钩在 tf.estimator.DNNRegressor 中实现提前停止

    我是张量流新手 想要实现提前停止tf estimator DNNRegressor带有可用的训练挂钩训练挂钩 https www tensorflow org api guides python train Training Hooks对于
  • 在反应对话框模型中打开 iframe 时,锚标记 href 不起作用

    我们开设了一个iframe在模式对话框中 在里面iframe我们正在加载一个document 该文档也是 html 页面 这 a 文档中的标签未导航至id他们中提到的href 只是来自的一个样本html文档 下面是 a 例子 a href
  • 你的 .vimrc 中有什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 调试 iOS Safari 上添加到主屏幕的 Web 应用程序

    我正在尝试调试添加到主屏幕的网络应用程序 我已经在 safari 上启用了网络检查器 如果我在 iOS safari 中打开 我可以调试该应用程序 但是当我将应用程序添加到主屏幕并尝试调试时 它显示 无可检查的应用程序 任何帮助 将不胜感激
  • 动态列出项目中的所有表单

    我想在列表框中动态列出项目中存在的所有表单的名称 然后通过单击每个表单 在另一个列表框中列出该表单上存在的所有按钮 但我不知道是否可以实施以及如何实施 如果您使用的是 Delphi 2010 您可以使用 RTTI 列出所有已注册 在应用程序
  • 编写软件时 64 位相对于 32 位的优势 [重复]

    这个问题在这里已经有答案了 如果我有一个像 HelloWorld 这样用 C 编写的简单程序 然后我在 32 位和 64 位的机器上编译它 我会得到两个不同的二进制文件做同样的事情 但它们是不同的机器代码 只有 32 位二进制文 件能够在