假设有
function f(int8_t a, int8_t b) // a b only need 8 bits
另一种选择是:
function f(int32_t a, int32_t b) // a b only need 8 bits
它在32位MCU中运行,如ARM Cortex_M
。哪个是关于所需代码大小,数据大小和执行效率的更好选择?
如果在8位MCU(例如8051)中,int8_t
应该更好,对吧?
答案 0 :(得分:7)
C为stdint.h
提供了更多类型,您可以假设在编译器实现级别上回答了问题。摘自C99草案:
7.20.1.3最快的最小宽度整数类型
1以下每种类型都指定一个通常运行最快的整数类型 在所有至少具有指定宽度的整数类型中。
2 typedef名称int_fastN_t指定带宽度的最快有符号整数类型 至少为N.typedef名称uint_fastN_t指定最快的无符号整数 宽度至少为N的类型。
3需要以下类型: int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
因此,只要在您的架构中定义它们,只需使用int_fast8_t
(或uint_fast8_t
)
答案 1 :(得分:1)
如果使用8位值,实际上可能会产生在操作后将该值掩盖回8位的惩罚...如果您的寄存器是32位并且使用32位值没有任何害处,那么只需使用他们...
答案 2 :(得分:1)
花费您的精力和精力,使代码更容易理解,以供将来的开发人员使用。不要担心为编译器或CPU简化操作。使用使意图和/或抽象的类型对于未来的开发人员来说最清楚。
如果函数参数的位宽不重要,则使用int
(或unsigned int
)。位宽无关紧要的示例可能包括局部变量和循环计数器。如果参数值必须是某个位宽,则使用uint8_t
,uint16_t
或uint32_t
。当变量表示外设寄存器,文件或协议消息中的固定大小字段时,特定位宽通常很重要。如果执行速度很重要,那么使用uint_fast8_t
等。这可能是经常执行或在中断中执行的代码段。
所有这些类型为开发人员提供了一个额外的线索,让您了解您认为重要的内容以及您的意图。您可以更好地花费精力为开发人员提供清晰的代码,而不是试图通过对CPU的微优化来思考编译器。
答案 3 :(得分:0)
Serge Ballesta response above关于使用int_fast8_t / uint_fast8_t,如果可能的话,这是一个很好的建议。
这是一篇关于这个主题的好文章:
32‐Bit Microcontroller Code Size Analysis, Joseph Yiu, Andrew Frame:
概述
微控制器应用程序代码大小可以直接使用 因此影响产品的成本和功耗 几乎总是被视为选择a的重要因素 微控制器用于嵌入式项自发布以来 可用的32位处理器,如ARM Cortex-M3,更多和 更多的微控制器用户已经发现了切换的好处 32位产品 - 更低功耗,更高能效,更小 代码大小和更好的性能。虽然大多数的好处 使用32位微控制器是众所周知的代码大小 32位微控制器的优势不太明显。
在这篇文章中 我们将解释为什么32位微控制器可以减少应用程序 代码大小,同时仍然实现高系统性能和易用性 使用
本文中一个非常有趣的观点是16位" int"使用32位MCU。在某些情况下,Keith Thompson"为什么不使用int?"可以是很好的建议。
另外提供信息:
Efficient C Tips #1 – Choosing the correct integer size
......我终于在这些问题上挣扎多年了 意识到C99标准委员会已经解决了这个问题 我们。不少人现在知道C99标准标准化了 特定整数类型的命名约定(int8_t,uint8_t, int16_t等)。不太为人所知的是他们也定义了数据 “最小宽度”和“最快宽度”的类型。
看看是否 你的编译器符合C99,打开stdint.h。如果符合要求, 除了uint8_t等数据类型,你还会看到至少两个 其他部分 - 最小宽度类型和最快最小宽度类型。
固定宽度无符号8位整数: uint8_t
最小宽度无符号8位整数: uint_least8_t
最快的最小宽度无符号8位整数: uint_fast8_t