Forum: Compiler & IDEs Makros in c und das Preprozessing


von Maddin (Gast)


Lesenswert?

Hey,

ich habe folgende

#define DSP_BIT_SEGS    0x01 //all segments (set digit on or off)
#define DSP_BIT_DP      0x20 //dot point on/off

nun frage ich mich bei den beiden Makros die ich geschrieben habe, 
welches wohl günstiger ist. Wieviel wird dem Prozessor vom 
Compiler/Preprozessor in den Fällen bereits abgenommen?

A)
#define DSP_F_RESET_BIT(digit,bit) 
Dsp_raw_data[digit].Bits&=bit^0xFF
B)
#define DSP_F_RESET_BIT(digit,bit)      Dsp_raw_data[digit].Bits&=~bit

Aufruf:

DSP_F_RESET_BIT(5,DSP_BIT_SEGS|DSP_BIT_DP);

oder

DSP_F_RESET_BIT(5,DSP_BIT_DP);

von Sven P. (Gast)


Lesenswert?

Ohne Kenntnis der zugrunde liegenden Prozessorarchitektur:
Völlig egal.

von Maddin (Gast)


Lesenswert?

ich nutze das AVR Studio mit AVR-GCC.

Maddin

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Probieren geht über Studieren. Probier es einfach aus. Nimm eine der X 
Möglichkeiten, ein Assembler-Dump zu erstellen (z.B. mit -save-temps 
-fverbose-asm) und schau nach.

von Rolf Magnus (Gast)


Lesenswert?

Ich würde auch ohne Kenntnis der Prozessorarchitektur davon ausgehen, 
daß beide Varianten exakt denselben Code produzieren, da der 
Compiler/Optimizer das hier schon so weit vorbereietet, daß in die 
Codegenerierung schon das gleiche reingeht. Wenn du im Zweifel bist, 
schau dir den generierten Assemblercode doch einfach mal an.

Bei Variante A fehlen übrigens Klammern:

Maddin schrieb:
> #define DSP_F_RESET_BIT(digit,bit)
> Dsp_raw_data[digit].Bits&=bit^0xFF

Damit macht der Präprozessor daraus:
1
Dsp_raw_data[5].Bits&=0x01|0x20^0xFF

und da ^ stärker bindet als |, interpretiert der Compiler das als:
1
Dsp_raw_data[5].Bits &= 0x01 | (0x20^0xFF)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
>
> Bei Variante A fehlen übrigens Klammern:

Bitto in B ...

> und da ^ stärker bindet als |, interpretiert der Compiler das als:

... da ~ stärker bindet als |

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.