我正在向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寄存器中吗?我是不是过度优化了?还有另一种选择吗?
您能帮我提供有关该问题的见解吗?
答案 0 :(得分:2)
如果您处于(并且需要)此优化级别,那么您将需要对代码进行反编译,并确切了解编译器的构造。
如果您真的想从那里进行优化,建议您编写一个自定义的汇编函数,以确保循环(是紧密循环吗?)是最佳的。这很痛苦,但是您要考虑的优化是按单个循环进行的。
即使在那时,这也可能无关紧要,像循环展开之类的优化比两个快速操作要重要得多。