【问题标题】:Wasn't Int type supposed to be the size of the platform word size?Int 类型不应该是平台字长的大小吗?
【发布时间】:2014-02-01 17:57:29
【问题描述】:

我听说过很多关于这个主题的相互矛盾的信息,但总的来说,我听说 Int 类型应该与平台字长有关,例如在 32 位机器中,Int 有 4 个字节。

除了我小时候开始在 DOS 上编码时,我认为我的编译器已经使用 32 位 Int,即使目标是需要不断使用短裤的 16 位处理器(如 286)...

今天我将我的一个程序编译为 64 位只是为了好玩,而 Int 仍然以 32 位结束(和短的 16 位,我没有测试过长)。

我知道 C 标准定义了这个:short <= int <= long 但我很好奇,发生了什么?为什么每个人都决定为 int 使用一些任意大小?

【问题讨论】:

  • 许多程序假定并依赖于 32 位宽 ints。这可能是 32b ints 保留在 64b 架构上的原因之一。

标签: c


【解决方案1】:

C99 Rationale 用很多词来解释为什么要引入long long,我引用的是关于整数类型历史的部分,我认为它至少可以部分回答你的问题。

Rationale for International Standard — Programming Languages — C §6.2.5 类型

在 1970 年代,16 位 C(用于 PDP-11)首先用 16 位整数表示文件信息,但很快就被磁盘进程淘汰了。人们切换到 32 位文件系统,首先使用 int[2] 构造,这不仅笨拙,而且不能有效地移植到 32 位硬件。

为了解决这个问题,long 类型被添加到语言中,尽管这需要 PDP-11 上的 C 生成多个操作来模拟 32 位算术。即使 32 位小型机与 16 位系统一起可用,人们仍然使用 int 来提高效率,将long 保留用于真正需要更大整数的情况,因为long 在 16 位系统上的效率明显较低。 shortlong 都添加到 C 中,使得 short 可用于 16 位,long 可用于 32 位,int 可用于提高性能。不希望将数字 16 或 32 锁定到语言中,因为至少存在用于 24 位和 36 位 CPU 的 C 编译器,而是提供可根据需要用于 32 位的名称。

PDP-11 C 可能已经用int 重新实现为 32 位,从而避免了 long;但这会使人们将int 的大多数用途更改为short 或在PDP-11 上遭受严重的性能下降。除了对源代码的潜在影响之外,即使在 1976 年,对现有目标代码和数据文件的影响也会更糟。到 1990 年代,随着软件安装量的巨大以及动态链接库的广泛使用,在现有环境中更改公共数据对象大小的影响是如此之大,以至于很少有人会容忍它,尽管在创建新环境时它可能是可以接受的。因此,许多供应商为了避免命名空间冲突,在他们的 32 位 C 环境中添加了一个 64 位整数,并使用了一个新名称,其中 long long 使用最广泛。

【讨论】:

    【解决方案2】:

    在过去,当内存总线大小与处理器寄存器大小具有相同的宽度时,这是正确的。但这在不久前就不再正确了,奔腾是您在标准硬件上找到的第一个处理器,其中内存总线大小更大,对于 32 位处理器来说是 64 位。一种提高总线吞吐量的简单方法。

    内存是一个非常重要的瓶颈,它比处理器的执行核心慢得多。一个与距离有关的问题,电信号传播得越远,在不损坏信号的情况下以高频切换信号就越困难。

    因此,处理器缓存的大小以及程序使用它们的效率在很大程度上决定了程序的执行速度。一次缓存未命中很容易花费 数百 个 CPU 周期。

    您的 64 位处理器没有获得两倍的缓存大小,无论您的程序在 32 位或 64 位模式下执行,L1 仍然是 32KB 指令和 32KB 数据。芯片上的可用空间,最重要的是缓存和执行引擎之间的距离是物理约束,由工艺技术的特征大小决定。

    所以将 int 制作成 64 位,虽然编译器很容易做到,但对程序速度非常不利。这样的程序使用缓存的效率要低得多,并且在等待内存总线时会遇到更多的停顿。

    64 位的主要data models 是 LLP64,Microsoft 做出的选择,以及 LP64,在 *nix 操作系统上做出的选择。两者都为 int 使用 32 位,LLP64 为 long 使用 32 位,LP64 使其为 64 位。 long long 都是 64 位的。

    【讨论】:

      【解决方案3】:

      该标准根据整数类型可以表示的值范围定义了最小大小。我不会全部引用,而是总结一下:

      • char 必须至少 8 位
      • shortint 必须至少 16 位
      • long 必须至少 32 位
      • long long 必须至少 64 位

      同时,引用 K&R(强调我的):

      意图是shortlong 应该在可行的情况下提供不同长度的整数; int通常是特定机器的自然大小。

      因此,如果可能的话,通常会匹配机器字长,但这绝不是强制性的,所以最终编译器作者可以任意决定int 是什么——只要它是shortlong或介于两者之间,至少 16 位。

      【讨论】:

        【解决方案4】:

        int 旨在成为合理的默认整数类型,仅此而已。这包括诸如底层平台最好支持哪种大小等问题,但还有更多问题。

        例如,字长可能相当小(8 位微控制器),尤其是当更大的类型可以被支持并且更普遍有用时。另一方面,如果字数大于通常需要的大小(64 位),现有程序会不合理地崩溃,甚至会因为过去的愚蠢假设而崩溃。

        【讨论】:

          【解决方案5】:

          int 应该是一个整数类型,具有适合执行环境的自然大小,但为了向后兼容,许多编译器即使在 64 位环境中也坚持使用 32 位整数。

          【讨论】:

            猜你喜欢
            • 2017-01-04
            • 2013-12-24
            • 1970-01-01
            • 2021-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多