智能typedef

时间:2009-03-30 15:08:28

标签: c performance types typedef

我总是在嵌入式编程中使用typedef来避免常见错误:

int8_t - 8位有符号整数
int16_t - 16位有符号整数
int32_t - 32位有符号整数
uint8_t - 8位无符号整数
uint16_t - 16位无符号整数
uint32_t - 32位无符号整数

最近的嵌入式缪斯(问题177,尚未在网站上)向我介绍了这样一个想法:拥有一些特定于性能的typedef是有用的。 This standard建议使用typedef来表示您想要具有最小大小的最快类型。

例如,可以使用int_fast16_t声明变量,但实际上它将在32位处理器上实现为int32_t,或者在64位处理器上实现为int64_t将是这些平台上至少16位的最快类型。在8位处理器上,int16_t位满足最小尺寸要求。

在我想知道之前从未见过这种用法

  • 您是否在嵌入式或其他任何项目中看到过这种情况?
  • 在typedef中避免这种优化的任何可能的原因?

6 个答案:

答案 0 :(得分:4)

从C99查看stdint.h

答案 1 :(得分:4)

  

例如,可以声明一个   变量使用int_fast16_t,但它   实际上将实现为   int32_t在32位处理器上,或   int64_t在64位处理器上   至少是最快的类型   这些平台上的16位

这就是int的用途,不是吗?您是否很快就会遇到8位CPU,这还不够?

您能够记住多少个唯一数据类型?

它是否提供了如此多的额外好处,每当我创建一个简单的整数变量时,值得有效地将要考虑的类型数量加倍?

我很难想象它可能会被一致地使用。

有人会编写一个返回int16fast_t的函数,然后其他人会将该变量存储到int16_t

这意味着在 fast 变体实际上有益的模糊情况下,它可能会改变代码的行为。它甚至可能导致编译器错误或警告。

答案 2 :(得分:3)

我要避免这种typedef的主要原因是它允许该类型欺骗用户。取int16_t vs int_fast16_t。两个类型名称都将值的大小编码为名称。这在C / C ++中并不常见。我个人使用特定于大小的typedef来避免混淆自己和其他人阅读我的代码。我们的大部分代码都必须在32位和64位平台上运行,许多人不知道平台之间的各种大小规则。像int32_t这样的类型消除了歧义。

如果我没有阅读你问题的第4段,而只是看到了类型名称,我会假设这是一种具有快速16位值的特定情景方式。而且我显然会错的:(对我而言,它会违反“不要让人惊讶”的编程规则。

也许如果它在名称中有另一个有区别的动词,字母,首字母缩略词,那么它就不太可能混淆用户。也许是int_fast16min_t?

答案 3 :(得分:2)

当我查看int_fast16_t时,我不确定它将运行的CPU的原生宽度,这可能会使事情变得复杂,例如~运算符。

int_fast16_t i = 10;
int_16_t j = 10;

if (~i != ~j) {
  // scary !!!
}

不知何故,我想根据处理器的原始宽度故意使用32位或64位。

答案 4 :(得分:0)

我实际上并不喜欢这种事情。

我已经多次看到过这种情况(事实上,我们在目前的工作地点甚至有这些类型的定义)...在大多数情况下,我怀疑它们的真正用处......它让我感到变化缘故......(是的,我知道一些内置插件的大小可能会有所不同)......

答案 5 :(得分:0)

我通常使用size_t,它恰好是最快的地址大小,这是我在嵌入时选择的传统。并且它从未在嵌入式圈子中引起任何问题或混淆,但当我开始使用64位系统时,它实际上开始引起我的问​​题。