c++ - 位设置和代码可读性

标签 c++ embedded performance arduino

我有一个 Arduino 应用程序(实际上是一个库),其中有许多状态标志 - 最初我只是将它们声明为整数(在这种情况下是 uint8_t 所以 8 位无符号字符)。但我可以将它们全部组合成一个整数,并使用位掩码操作来设置和测试状态。

前者的一个例子:

if (_shift == HIGH)
{
    _shift = LOW;
}
else
{
    _shift = HIGH;
}

后者的例子

#define SHIFT_BIT 0

if (bitRead(_flags, SHIFT_BIT) == HIGH)
{
   bitWrite(_flags, SHIFT_BIT, LOW);
}
else
{
   bitWrite(_flags, SHIFT_BIT, HIGH);
}

前者读起来更好,但后者更高效(空间和时间)。在这种情况下,空间和时间效率应该始终取胜,还是一种只应在需要时发生的优化?

(已添加)

为了完整起见,这里是那些 bitWrite 等宏的接线定义:

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

最佳答案

查看 Raymond Chen's excellent take在这个问题上。总之,您需要进行一些详细的计算,以确定后一种情况是否实际上更有效,具体取决于实际设置这些状态的对象数量与调用站点数量。

就可读性而言,您似乎是在使用成员变量来执行此操作,这意味着您可能已将它们封装在漂亮的函数中。在那种情况下,我不太关心可读性,因为至少使用该类的人的代码看起来不错。但是,如果有顾虑,您始终可以将其封装在私有(private)函数中。

关于c++ - 位设置和代码可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1197111/

相关文章:

c++ - openGL 中的全屏

c++ - 在子窗口的 OnShowWindow 中将焦点设置到父窗口不起作用

c++ - C++:在数组中输入数字时,第一个数字为0

java - 与应用程序打包在一起的最轻的数据库

c++ - 使用重载流插入运算符输出对象的双指针成员?

c - 屏蔽数组成员的位

python - 为低系统资源的嵌入式系统优化 Python 运行时指南

c - 为什么 C 比 Go 或 D 更快地构建小程序?

java - 分配处理时通常有多少开销?

python - Python 中的基准测试 : Why does my code run slower with repetition?