【问题标题】:Efficiency in array packing: 8bit (byte) vs 16bit elements?数组打包的效率:8 位(字节)与 16 位元素?
【发布时间】:2013-02-05 18:34:04
【问题描述】:

我目前正在用 c 语言为 atmel (Atmega328) 的 8 位微控制器编程。在程序中,我有一个存储数千个 2 位整数的 8 位数组,因此它位于程序存储空间中。目前,我在每个字节中放置了四个 2 位整数,但现在仔细想想,似乎很愚蠢……

使用具有 16 位值的数组并在每个位置存储八个 2 位变量不是更有效吗?

微控制器 (atmega328p) 是一个 8 位 IC,每条机器指令为 16 位。

【问题讨论】:

  • 效率更高是什么意思?
  • 编译然后反汇编看看编译器在做什么。它可能会将 8 位值打包到内存中,这样您就不会丢失一半的内存
  • @dwelch:是的,它就是这样工作的。无论哪种方式,每个程序字节都有四个元素。
  • 这就是我希望它工作的方式,我总是想知道编译器正在做我希望它正在做的事情......
  • @dwelch:我使用过 avr-gcc。这正是它的工作原理。

标签: c memory avr 8-bit


【解决方案1】:

怎样才能更有效率?

空间效率

2 位整数占用 2 位。您对此无能为力。

时间效率

无论您如何打包它们,您仍然需要执行相同数量的按位运算来从较大的值中提取您的 2 位数字。

【讨论】:

  • 除非 OP 一次清除数组或更新多个 2 位整数的值。
  • 数组在程序内存中,在 AVR 上几乎是只读的。
  • 我认为问题是占用 16 位位置,8 位数组和 8 位丢弃(4 个 2 位项而不是 8 个 2 位项)。我不认为这是一个问题。
  • 但他说“每个位置有 8 个 2 位变量”?
【解决方案2】:

由于这是一个带有 8 位寄存器的 8 位处理器,因此在用汇编语言编程时,它不会改进对 16 位操作数的操作。但是对于 c 编译器来说,事情要复杂得多。编译器绝对有可能将 8 位操作数转换为执行 16 位算术的 16 位操作数,因为对于我所知道的几乎所有编译器,int 大小通常至少为 16 位。

所以拆机确实是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多