【问题标题】:Advantages and disadvantages between int vs int_fast8_tint 与 int_fast8_t 之间的优缺点
【发布时间】:2013-08-10 14:40:45
【问题描述】:

当我在 c 中学习数据类型时。我遇到了int_fast8_t 和int_least8_t 数据类型。我不知道这些,所以我用谷歌搜索了它。我在这里找到了一些答案:

The difference of int8_t, int_least8_t and int_fast8_t?

答案是int_fast8_t 是最快的,但令我惊讶的是什么东西让它变得更快。编译器使用什么技术使其快速?而且,当存在 int 数据类型和 short,long 修饰符来修改 int 大小时。这个 (int_fast8_t) 数据类型需要什么?

如果int_fast8_t 更快,那么我们可以简单地忽略int 并始终使用int_fast8_t,因为每个人都需要速度。

int_fast8_t 有什么限制吗? int_fast8_t and int之间有什么优缺点。

【问题讨论】:

  • 好吧,从int 与int_fast8_t 的位宽开始可能会有所不同,这意味着您不能真正安全地使用int_fast8_t,除非它是一个8 位整数。跨度>
  • 最终,使用它就像你被限制在那个确切的位数一样。唯一要处理的问题是上溢/下溢,在这种情况下,您应该使用最小宽度类型。如果您知道自己在做什么或知道某些内容不会溢出,那么快速类型可能是有益的。安全第一。 :-)
  • 即使是最小宽度类型也不会定义上溢/下溢。不能保证在给定的架构上会有一个确切大小的类型,例如,有些架构 int_least32_t 可能是 36 位。

标签: c


【解决方案1】:

如果您将代码从一种架构迁移到另一种架构,简短的回答就是兼容性。

int_fast8_t 可能与int 相同,因为在大多数(很多?一些?)架构中,int 类型被定义为本机字的大小(32 位对于 32 位架构,64 64 位架构中的位)。基本上,int_fast8_t 是说,如果我的解释正确,那么底层类型将是最快的,可以保存至少 8 位信息。

如果您将代码移动到不同的架构,您可以确定如果您使用int_fast8_t,您仍然至少有 8 位可供使用。如果您只是使用int,您无法确定这一点。

【讨论】:

  • @Leushenko 同意int 的最小大小。因此,在符合 C 的情况下,8 位架构上的 int 不是 @GSP 建议的“本机单词的大小”。 (嵌入式处理器通常仍然是 8 位的。)
【解决方案2】:

int_fast8_t 是最快的整数类型,至少 8 位宽。没有理由认为它会比 int 更快(这通常是最快的整数类型。)

此外,这两种类型的宽度可能不同,这意味着它们通常不能互换使用。

【讨论】:

  • 所以请告诉我哪个更好使用 int_fast8_t 或 int ?如果我知道我的机器特定于 8 位大小。我应该去 int_fast8_t 吗?
  • @niko:简而言之:使用int,直到有明确、具体和可衡量的需要使用其他东西。
  • 我已经完成了你的回答,最后一件事 int_least8_t 需要什么?
【解决方案3】:

例如,在 32 位平台上,int 是 32 位的,CPU 可能具有操作 32 位数据块的指令。它可能没有针对 8 位数据的此类指令。在这种情况下,CPU 可能不得不使用一些按位运算来处理 8 位类型的数据。

在这样的平台上,int_fast8_t 可以实现为 32 位的int。但是你不能把它当作 32 位的int 来使用,你只能像 8 位的类型那样使用它而没有未定义的行为。

【讨论】:

  • 实际上,只有intptr_t 和intNN_t 精确宽度类型(以及它们对应的以'u'为前缀的无符号类型)是不需要的。 int_leastNN_t、int_fastNN_t 和 intmax_t 都是必需的。这适用于 NN = 8、16、32 和 64 的 NN 值。但是,不能保证快速类型在该平台上是最快的。所保证的只是满足签名和宽度要求。
  • @ChronoKitsune 你说得对,它在 C11 7.20.1.3 中,修正了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2019-01-27
  • 1970-01-01
  • 2011-01-26
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多