首先,如果您定义了诸如 uint16 之类的类型,它们是在哪里定义的?它们不是标准类型,因此将在某些专有标头中定义-可能是您的标头,也可能由某些第三方库提供;在这种情况下,您必须问自己该代码的可移植性如何,以及您是否正在创建在其他应用程序中可能没有意义的依赖项。
另一个问题是,许多库(不明智的 IMO)定义了具有各种名称的此类类型,例如 UINT16、uint16、U16 UI16 等,这在确保类型一致性和避免名称冲突方面变得有些噩梦。如果定义了此类名称,则理想情况下应将它们放置在命名空间中或赋予库特定前缀以指示它们被定义为与哪个库一起使用,例如rtos::uint16
to rtos_uint16
.
由于 ISO C99 标准库在 stdint.h 中提供了标准位长度特定类型,因此您应该优先使用它们而不是专有或第三方头文件中定义的任何类型。这些类型有一个_t
后缀,例如uint16_t
. 在 C++ 中,它们可能被放置在std::
命名空间中(尽管这不是给定的,因为在 C99 中引入了标头)。
1] 使用 uint16 的用途/好处是什么,而 uint32 也足够(如果有的话)?
除了我之前对 prefer stdint.h
's 的建议之外uint16_t
,使用长度特定类型至少有两个正当理由:
- 匹配特定的硬件寄存器宽度。
- 跨不同架构强制执行通用且兼容的 API。
2] 使用较短的数据类型(考虑数据对齐)会节省内存使用吗?
可能,但如果内存不是您的问题,那不是使用它们的好理由。对于大型数据对象或数组可能值得考虑,但全局应用很少值得付出努力。
3]如果是为了节省几个字节的内存,在现代硬件中这样做是否明智?
见[2]。然而, “现代硬件”并不一定意味着大量资源;例如,有很多只有几 Kb RAM 的 32 位 ARM Cortex-M 设备。这更多地与芯片空间、成本和功耗有关,而不是与设计或架构的时代有关。