私はArduinoアプリケーション(実際にはライブラリです)に数多くのステータスフラグを持っていますが、もともと私はintとして宣言していました(この場合uint8_tなので8ビットのunsigned charsです)。しかし、それらをすべて1つの整数に結合し、ビットマスク操作を使用してステータスを設定およびテストすることができました。ビット設定とコードの可読性
前者の例:
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))
私はクラスのいくつかのインスタンスがある場合にはそのほとんどに同意します。しかし、(a)構造のインスタンスを1000個作成することはあまり知られていないかのように話します。(b)自然な単語 - 原子性の利点は疑いの余地がありません。あなたのマルチスレッドコードが原子の読み書きに依存しているが原子レベルの更新は必要ないフィールドは、1000個のインスタンスを持つ構造体よりもかなり稀です。ほとんどの場合、キャッシュ一貫性のないアーキテクチャに移動するとすぐに中断します。 –
私はリファレンスを見て、感謝します。この場合(それはボタン/ ledの組み合わせを管理する一般的なクラスです)、私は約20以上のインスタンス化を想像することはできませんでしたが、約1000インスタンスのポイントは正しいですが、この特定のケースではありません... –
(それを読んだ後、 。それは良い記事です。良いことは、ターゲットアプリケーションのメモリーフットプリントと関連するメモリー使用量を調べることでこれを直接測定できることです。私が目標としているチップでは、 "変数"では2k、プログラムでは30kしか使用できません。したがって、後者を増やすことによって前者を減らすことは良いトレードオフになる可能性があります。 –