c++ - 什么在 cpu 成本方面更好?在运行时移位或将所有可能的值存储在数组中?

标签 c++ arduino compiler-optimization esp8266 cpu-registers

我正在为 Arduino 平台中的 ESP8266 MCU 编写 C++ 代码,我正在努力让我的代码尽可能高效。

要通过 I2C 操作其他 MCU,我需要配置其存储 8 位的内部寄存器。为了设置位开/关,我使用了按位掩码。

实现此目的的一种方法是移位位并以这种方式应用按位 &(和)掩码 Set the i-th bit to zero? .

但我也可以将所有 8 个可能的移位值存储在一个数组中,直接访问它们并逐出进行位移。

像这样:

const unsigned int PINS[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};

...

pt = pt & ~(PINS[i]);

代替:

pt = pt & ~(1 << i);

我认为这可能会更糟,具体取决于 MCU 的编译器将如何处理它。 通过索引访问数组成本更高?数组值将在 cpu 寄存器中?我是否过度优化?还有其他选择吗?

你能帮我了解一下这个问题吗?

最佳答案

如果您处于(并且需要)这个优化级别,您就需要反编译代码并准确查看编译器构建的内容。

如果您真的想从那里进行优化,我建议您编写一个自定义汇编函数,以确保循环(它处于紧密循环中,对吗?)是最佳的。这很痛苦,但您正在查看的优化是按单个周期的顺序进行的。

即使到那时,这可能也无关紧要,像循环展开这样的优化将比两次快速操作更重要。

关于c++ - 什么在 cpu 成本方面更好?在运行时移位或将所有可能的值存储在数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55886446/

相关文章:

c++ - 如何在 C++ 中定义 vector ?

c++ - 尝试用 vector 填充结构时 vector 下标超出范围

通过编译器或 JIT 进行 java 优化

c++ - 虚函数调用的编译器优化

c++ - 使用 `size_t` 长度会影响编译器优化吗?

c++ - 类地址与值地址不同?

c++ - 为什么 std::list 的相等比较不能通过编译而 T 是 EqualityComparable

c - Arduino 纳米 : Memory stability issue

c++ - 将数组各种类型传递给微 Controller 上的规则引擎的要求。类型转换有问题

C switch case 值不能在 switch 内修改(不是常量)