在编译时解析(u)int_fastX_t

时间:2017-01-16 10:27:31

标签: c++

C ++标准类型的实现将(u)int_fastX类型定义为其内置类型之一。这需要研究哪种类型最快,但每种情况都不能有一种最快的类型。

在编译时通过选择实际使用的最佳类型来解决此类问题,是否会提高性能?编译器将分析_fast变量的使用,然后选择最佳类型。发挥作用的因素可能是对齐以及与变量一起使用的操作类型。

这将有效地使这些类型成为语言功能。

当编译器突然决定为这样的变量选择另一个宽度时,这可能会引入错误。但是在这种用例中不应该使用_fast类型,其行为取决于宽度,无论如何。

标准是否允许这样的编译时间解析? 如果是的话,为什么现在还没有实施呢? 如果不是,为什么它不符合标准呢?

1 个答案:

答案 0 :(得分:1)

不,标准不允许这样做。请记住,对于这个特定区域,C ++标准遵循C,例如,按照C++11 1.1 /2,C ++ 11遵循C99。具体来说,C++11 18.4.1 Header <cstdint> synopsis /2表示:

  

标题定义所有函数,类型和宏,与C标准中的7.18相同。

所以,让我们先解决你的第一个争论,你说:

  

C ++标准类型的实现将(u)int_fastX类型定义为其内置类型之一。这需要研究哪种类型最快,但每种情况都不能有一种最快的类型。

C标准可以这样说,c99 7.18.1.3 Fastest minimum-width integer types(我的斜体):

  

以下每种类型都指定一个整数类型,通常最快可以在具有至少指定宽度的所有整数类型中操作。

     

所有目的不能保证指定类型最快;如果实现没有明确的理由选择一种类型而不是另一种类型,它将简单地选择一些满足签名和宽度要求的整数类型。

所以你确实是正确的,一种类型对于所有可能的用途都不是最快的,但这似乎不是作者在定义这些方面时的想法。

引入固定宽度类型是(在我看来)解决所有开发人员在各种实现中具有不同int宽度的问题。

类似地,一旦开发人员知道他们想要的值范围,快速最小宽度类型就可以让他们以最大可能的速度对这些值进行算术运算。

在最后一段中填写您的三个具体问题(下面加粗):

(1)标准是否允许这样的编译时间分辨率?

我不相信。 C标准的相关部分有一小段文字:

  

对于实现提供的此处描述的每种类型,<stdint.h>应声明typedef名称并定义关联的宏。

这似乎表明它必须是实现提供的typedef,并且由于没有“变量”typedef,因此必须修复它。

可能会摆动房间,因为根据某些环境因素可能会提供不同的typedef,但实际执行此操作的难度似乎很高(请参阅我对您的回答)第三个问题)。

其中最主要的是这些适应性类型,如果它们具有外部链接,则在链接在一起时需要在所有编译的翻译单元之间达成一致。一个单元具有16位类型而另一个单元具有32位类型将导致各种问题。

(2)如果是,为什么不在今天实施?

我正在推动“否”作为对你的第一个问题的回答所以我不打算推​​测这个,除了通过引用你对下面第三个问题的答案(它可能没有实现,因为它很难,可疑的好处)。

(3)如果不是,为什么不在标准中?

标准是实现者和用户之间的契约,描述了实现者将提供的内容。通常情况下,标准委员会往往会更多地由前者(他们并不热衷于为自己做太多额外的工作)而不是后者。

例如,我会喜欢在C中拥有所有你自己的C ++数据结构,但这会导致标准版本相隔几十年而不是几年: - )