【问题标题】:Which is better? int8_t vs int32_t in 32 bits MCU哪个更好? 32 位 MCU 中的 int8_t 与 int32_t
【发布时间】:2015-06-12 18:03:51
【问题描述】:

假设有

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应该更好吧?

【问题讨论】:

  • 试试看你会得到什么。
  • 在 32 位 MCU 上,前面的代码可能会将 8 位转换的 32 位数字存储在堆栈中,因此不会有太大区别。
  • 如果您选择 8 位,请确保您正确使用有符号或无符号。
  • function f(int32_t a, int32_t b) 可能只需要 8 位,但是通过了 32 位,如何确保 f()使用 8 位? f(int8_t a, int8_t b) 肯定会确保只使用 8 位。考虑到 2 个函数签名,嫌疑人 f() 将以您意想不到的方式发生微妙的变化。 IOWs,如果现在功能错误,效率提高有什么用?发布您的样本f()

标签: c arm microcontroller 8051


【解决方案1】:

C 在stdint.h 中为您提供了更多类型,您可以假设问题已在编译器实现级别得到解答。摘自 C99 草案:

7.20.1.3 最快的最小宽度整数类型

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

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

【讨论】:

    【解决方案2】:

    花费您的精力和精力使代码更易于未来的开发人员理解。不要担心让编译器或 CPU 变得容易。使用能让未来开发人员最清楚意图和/或抽象的类型。

    如果函数参数的位宽无关紧要,则使用int(或unsigned int)。位宽无关紧要的示例可能包括局部变量和循环计数器。如果参数值必须是某个位宽,则使用uint8_tuint16_tuint32_t。当变量表示外设寄存器、文件或协议消息中的固定大小字段时,特定的位宽通常很重要。如果执行速度很重要,则使用uint_fast8_t 等。这可能在一段经常执行的代码中或在中断中。

    所有这些类型都为阅读您的代码的开发人员提供了额外的线索,让他们了解您认为什么是重要的以及您的意图是什么。您最好将精力花在让开发人员清楚地了解代码上,而不是试图通过 CPU 的微优化来超越编译器。

    【讨论】:

      【解决方案3】:

      如果您使用 8 位值,您实际上可能会在操作后将该值屏蔽回 8 位的惩罚...如果您的寄存器是 32 位并且使用 32 位值没有害处,那么只需使用他们……

      【讨论】:

        【解决方案4】:

        Serge Ballesta 的 response above 关于尽可能使用 int_fast8_t/uint_fast8_t 是一个很好的建议。

        这是一篇关于这个主题的好文章:

        32‐Bit Microcontroller Code Size Analysis, Joseph Yiu, Andrew Frame:

        概述

        微控制器应用程序代码大小可以直接 影响产品的成本和功耗,因此它是 几乎总是被视为选择一个重要因素 用于嵌入式项目的微控制器。自发布以来, 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

        【讨论】:

        • 详细信息:“如果它是合规的,以及 uint8_t ....”并非如此。固定宽度 uint8_t, int32_t, etc. 在 C99 中是可选的(取决于许多问题)。 leastfast 是必需的。
        猜你喜欢
        • 2013-07-18
        • 2023-04-07
        • 2013-01-09
        • 2012-09-30
        • 2015-09-22
        • 2015-09-06
        • 2014-04-02
        • 2013-11-28
        • 2010-10-11
        相关资源
        最近更新 更多