Makros in c und das Preprozessing

Gast #2148611
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);
Gast #2148698
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren