Ich habe eine Arduino-Anwendung (naja, eigentlich eine Bibliothek), die eine Reihe von Status-Flags enthält - und ursprünglich habe ich sie einfach als Ints deklariert (gut uint8_t also 8 Bit unsigned Zeichen in diesem Fall). Aber ich hätte sie alle zu einer ganzen Zahl kombinieren und Bitmask-Operationen verwenden können, um den Status zu setzen und zu testen.Bit-Einstellung und Code-Lesbarkeit
Ein Beispiel für ersteres:
if (_shift == HIGH)
{
_shift = LOW;
}
else
{
_shift = HIGH;
}
ein Beispiel für die letztere
#define SHIFT_BIT 0
if (bitRead(_flags, SHIFT_BIT) == HIGH)
{
bitWrite(_flags, SHIFT_BIT, LOW);
}
else
{
bitWrite(_flags, SHIFT_BIT, HIGH);
}
Erstere liest besser, aber die letztere ist effizienter (Raum und Zeit). Sollte in dieser Situation die Raum- und Zeiteffizienz immer gewinnen oder ist dies eine Art Optimierung, die nur bei Bedarf stattfinden sollte?
(Added)
Der Vollständigkeit halber hier die Verdrahtung Definition dieser bitWrite usw. Makros:
#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))
ich mit den meisten, dass im Fall zustimmen, wo es nur wenige Instanzen der Klasse sind. Aber (a) er spricht, als ob es unerhört ist, 1000 Fälle einer Struktur zu schaffen, und (b) die Vorteile der natürlichen Wort-Atomizität sind zweifelhaft-zu-nichts. Ein Feld, in dem Ihr Multi-Threaded-Code auf atomaren Lese- und Schreibvorgängen basiert, aber nie eine atomare Aktualisierung benötigt, ist wesentlich seltener als eine Struktur mit 1000 Instanzen. Und wird in den meisten Fällen brechen, sobald Sie es in eine Architektur verschieben, die Cache-Kohärenz fehlt. –
Ich schaue mir die Referenz an, danke. In diesem Fall (es ist eine allgemeine Klasse, die eine Tasten-/LED-Kombination verwaltet) konnte ich mir nicht vorstellen, mehr als etwa 20 zu instanziieren, aber der Punkt über 1000 Instanzen ist richtig, aber nicht in diesem speziellen Fall ... –
(Später nach dem Lesen) . Das ist ein guter Artikel. Das Gute daran ist, dass ich dies direkt messen kann, indem ich den Speicherbedarf der Zielanwendung und die damit verbundene Speichernutzung betrachte. In dem Chip, auf den ich ziele, stehen nur 2k Ram für "Variablen" zur Verfügung, aber 30k für das Programm. Also die Reduzierung der ersten durch die Erhöhung der letzteren kann ein guter Kompromiss sein ... –