【问题标题】:Why don't we use a short integer to represent a return value? [closed]为什么我们不用一个短整数来表示一个返回值呢? [关闭]
【发布时间】:2017-08-16 20:41:25
【问题描述】:

很多书都说我们决不能在算术和函数定义上浪费一点。我看到很多从 0 到 255 的小数被定义为 char 类型变量,甚至更大的正数被定义为 unsigned short int 类型。

我们为什么不用一个无符号的short int 或者一个char 类型来代替int 来表示一个返回值呢?

我试过了:

char main(){return 0;}

没关系。

【问题讨论】:

  • “很多书都说我们决不能浪费一点……” 什么书这么说的?这不是一个真实的说法。
  • 你的函数可以返回任何你想要的,但不能返回main()。那个返回 int 因为这是 C 标准指定它的方式。
  • 该标准特别要求main 返回一个int(稍微过于简单化),所以这就是调用环境所期望的。如果您愿意,您可以为 main 以外的函数使用 char 返回类型,但这不会有很大帮助。
  • 除此之外,据我所知,在硬件级别,您永远无法有效地从内存中仅获取 1 个字节,因此节省字节确实没有性能优势。编译器甚至会对变量强制进行 4 字节对齐以提高性能,因为在变量之间放置垃圾比仅仅因为变量地址未对齐而不得不从两个单独的地址获取数据要好。
  • @KeithThompson:在 8 位 MCU 上这是常见的做法。

标签: c types return


【解决方案1】:

如果你学过汇编语言和微机原理,你就会知道,这是访问数据的快捷方式(一个周期)。

对于 32 位或 64 位 CPU,一个指令周期可以获取/设置 32 位或 64 位数据。 如果一个变量被定义为 int,CPU 可以通过一个周期获取/设置它的值。如果对 32 位 CPU 使用 char 或 short,CPU 需要更多的周期来获取/设置其值。

如果您在 8 位或 16 位 CPU 上工作,情况会有所不同。但通常int的长度与CPU的位相同,所以整数是访问速度最快的类型。

【讨论】:

  • “如果对 32 位 CPU 使用 char 或 short,CPU 需要更多的周期来获取/设置它的值。” -- 这很少是真的。绝大多数现代 CPU 将以完全相同的速度处理 8、16、32 或 64 位数字。我能想到的唯一现实世界例外是 BWX Alpha 之前的处理器,我认为使用这些处理器的人数……很少。
  • 你检查过DSP或ARM的汇编代码吗?你知道 DSP 或 ARM 是如何优化他们的代码的吗?例如,为了提高访问速度,优化时会将char转为整数。
  • 诚然,我对 DSP 代码了解不多(但对于一般性的回答,这听起来也相当深奥),但我很好奇您所说的 ARM 上的操作。你是说使用shorts 或chars 超过ints 对性能有什么特别的影响?一方面,我没有发现任何特殊情况。
【解决方案2】:

返回short 甚至是char 而不是int 很少有任何节省。在绝大多数 C 实现中,机器寄存器将用于保存返回值,返回 short 而不是 int 的唯一区别是寄存器的一部分将保持未使用状态。 (顺便说一句,这也是 main 返回 char 对您“有效”的原因,即使标准不保证它会这样做。)

实际上,返回short 的唯一原因是,当您有一个特定的算法有明显的理由使用shorts 而不是ints 时,这并不常见。

为了记录,函数参数也可以这样说。

【讨论】:

  • 补充一点,如果我理解正确的话,在从 int 到您使用的任何较小的数据选择的隐式转换中,您还有一两个额外的时钟滴答,因此您将承担除了部分使用寄存器之外,还从默认 int 进行隐式转换。
  • @DavidC.Rankin:不确定您可能从哪里得到这个想法。 可能在演员阵容中涉及成本,但这并不是我们真正谈论的内容,是吗? (在很多情况下,甚至这些都是免费的,甚至可能是大多数。)
  • @DavidC.Rankin:再想一想,我猜你说的是英特尔 CPU 上的部分寄存器停顿。即便如此,如果有的话,也只是演员表中的一个问题,只要你继续使用与 shorts. 相同的值,我相信这就是我们在这里谈论的内容。
  • @DavidC.Rankin:另外,第三个想法,我相当确定那些部分寄存器停顿甚至只在重新组合寄存器部分时发生(例如,当你有一个 EAX 时非零的高 16 位,写入 AXALAH,然后再次从 EAX 读取——这是最后一个需要重新组合 µop 的操作)。我相当肯定,简单地从部分寄存器中读取或进行符号/零扩展不会有额外的惩罚。
  • 这一定是我想的。我记得之前的讨论,这里是 S.O.关于 shortchar 而不是 int 的编译器处理,以及它是否是强制转换(我认为这是隐式转换)或处理 EAX 中的高 16 位在 8 位或 16 位操作之后,我不能肯定地说。 (我希望我能找到线程)。当我把手伸进去时,我会放回一个链接。
猜你喜欢
  • 2017-08-27
  • 2016-12-27
  • 2021-08-18
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多