Forum: Compiler & IDEs Platzsparen mit struct?


von Robert F. (fastred)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Robert F. (fastred)


Lesenswert?

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 ;)

von Matthias K. (mkeller)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.