8 Bytes für 8 Bit Zustände oder lieber 1 Byte?

Gast #951226
Hallo zusammen,
C kann ja von Hause aus keinen Datentyp für ein Bit.
Also nimmt man entweder ein Byte für ein ganzes Bit oder benutzt ein 
Byte um acht Bits zu speichern und greift dann etwas komplizierter 
darauf zu.
z.B.: status & _BV(sleep)

Die erste Lösung belegt natürlich viel Speicher im Stack, weil alle 
Variablen permanent geladen sind.
Dafür ist die Programmausführung effektiver und der Code kleiner.

Bei der zweiten Lösung bleibt der Stack klein, dafür wird das Programm 
größer und langsamer.
Für den bitweisen Zugriff auf ein Byte gibt es auch schicke Abkürzungen:
struct test {
  byte b0:1;
  byte b1:1;
  byte b2:1;
  byte b3:1;
  byte b4:1;
  byte b5:1;
  byte b6:1;
  byte b7:1;
} __attribute__((packed));

oder einfach über defines.
Aber egal wie, die bitweise Methode ist umständlicher (mehr 
Operationen).

Kann man generell sagen, welche Methode besser ist?
Habe ich noch etwas übersehen, was man beachten sollte?

Grüße
Gast
Flo wrote:
> Kann man generell sagen, welche Methode besser ist?
Nö. Punkt.

Die Vor- und Nachteile beider Methoden hast du vollkommen richtig 
erfasst. Nun ists an dir, abzuwägen, wo es zeitkritisch ist und/oder wo 
es vom Speicher her eng wird.

> Habe ich noch etwas übersehen, was man beachten sollte?
Denke nicht. Wobei du aber beim AVR richtig gut optimieren kannst, was 
solche Bitvektoren angeht. Der AVR hat nämlich Instruktionen wie 
"Springe wenn Bit gesetzt" und so weiter; schau dir am besten mal das 
Assemblerlisting des Compilers nachher an.
Flo wrote:
> Die erste Lösung belegt natürlich viel Speicher im Stack, weil alle
> Variablen permanent geladen sind.
> Dafür ist die Programmausführung effektiver und der Code kleiner.

Dann mußt Du erstmal sagen, welche Architektur Du meinst.
Beim AVR mag das stimmen.
Beim 8051 oder ARM Cortex M3 aber nicht, die haben spezielle Bitbefehle 
direkt auf den SRAM, d.h. da ergeben Bitzugriffe auch kleineren Code.


Peter
Gast
Ein ganzes Byte pro Bit zu nehmen hat auch noch den Vorteil, daß man 
kein Locking braucht, wenn nebenläufige Prozesse auf die Bits zugreifen.

Jürgen

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.