我总是在嵌入式编程中使用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
位满足最小尺寸要求。
在我想知道之前从未见过这种用法
答案 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位系统时,它实际上开始引起我的问题。