就CPU成本而言,什么更好?在运行时移位位还是将所有可能的值存储在数组中?

时间:2019-04-28 02:07:05

标签: 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寄存器中吗?我是不是过度优化了?还有另一种选择吗?

您能帮我提供有关该问题的见解吗?

1 个答案:

答案 0 :(得分:2)

如果您处于(并且需要)此优化级别,那么您将需要对代码进行反编译,并确切了解编译器的构造。

如果您真的想从那里进行优化,建议您编写一个自定义的汇编函数,以确保循环(是紧密循环吗?)是最佳的。这很痛苦,但是您要考虑的优化是按单个循环进行的。

即使在那时,这也可能无关紧要,像循环展开之类的优化比两个快速操作要重要得多。