Platzsparen mit struct?

OP #1622000
Hallo,

für eine PWM Implementierung möchte ich folgendes struct als 
Datenstruktur verwenden:
1
typedef struct
2
{
3
  uint8_t value; 
4
  uint8_t state:1; 
5
  uint8_t chan_id:7; 
6
} pwm_chan_t;

Meines Wissens nach versucht der Compiler bei der "var:n"-Notation 
Variablen zusammenzufassen, in diesen Fall also (hoffentlich) das 
einzelne Bit von state und chan_id.


Ist das bei 8-bit Systemen (AVR) sinnvoll in Hinblick auf Verbrauch von 
(S)RAM und insbesondere bei Zugriffen?
Weil die Information, dass das x. Bit eines Registers zu einer (anderen)
Variable gehört, muss ja irgendwo gespeichert werden (Kosten: min. 
8bit), und abgerufen werden (Zugriffskosten)...


Vielen Dank
Robert F. schrieb:

> Meines Wissens nach versucht der Compiler bei der "var:n"-Notation
> Variablen zusammenzufassen,

Es läuft darauf hinaus.
Aber eigentlich definierst du damit nur 2 Bitfelder.

> in diesen Fall also (hoffentlich) das
> einzelne Bit von state und chan_id.

Kann man so sagen

> Ist das bei 8-bit Systemen (AVR) sinnvoll in Hinblick auf Verbrauch von
> (S)RAM und insbesondere bei Zugriffen?

Kommt drauf an.
Wenn du 2 Millionen derartige Objekte hast, wird die Speicherersparnis 
schon beträchtlich sein.
Hast du aber nur 2 davon, spart das gerade einmal 2 Bytes ein :-)

aber

> Weil die Information, dass das x. Bit eines Registers zu einer (anderen)
> Variable gehört, muss ja irgendwo gespeichert werden

gespeichert in dem Sinne wird es nirgends im Programm. Der Compiler 
nimmt das zur Kentnis und muss beim Zugriff auf die Bitfelder Code 
generieren, die nur die angegebenen Bits setzen/löschen. In dem Sinne 
...

 (Kosten: min.
> 8bit), und abgerufen werden (Zugriffskosten)...

... werden die Zugriffskosten höher und logischerweise auch der 
Programmcode, der für den Zugriff verantwortlich ist.


In der Programmierung gibt es eine 'Faustregel - Grundgesetz':
"Time for Space, and vice versa"

Bedeutet: Man erkauft sich oft geringere Laufzeit mit mehr 
Speicherverbrauch. Und auch umgekehrt: geringeren Speicherverbrauch mit 
erhöhter Laufzeit.
OP
mhh d.h. bei meinem Target (atmega168) und meiner Anzahl von Instanzen 
des struct (1-16) macht das also eher keinen/noch keinen Sinn ...

Wenn ich am Wochenende mal Zeit habe, kann ich mir ja mal den 
generierten ASM Code anschauen und die Takte zählen ;)
Matthias Keller schrieb:
> also macht es vermutlich keinen Unterschied wenn man in diesem Beispiel
> die Variable state einfach als 8bit int deklariert? Damit dürft dann der
> Zugriff doch einfacher sein ( je nach dem wie man die Variable nutzt).
> Ist das so richtig?

Vermutlich hast du recht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.