Optimierter enum Einsatz ?



  • Wozu machen einige C Programmierer folgendens:

    enum eFarbe { GELB, BLAU };
    
    unsigned char Farbe;
    

    und nicht:

    typedef enum eFarbe { GELB, BLAU };
    
    eFarbe Farbe;
    

    Vermutlich spart man sich hier ein Byte (enum = int) und kann damit wesentlich mehr typunsichere Operationen durchführen.

    Aber warum macht man das ?



  • Bitte ein Bit schrieb:

    Vermutlich spart man sich hier ein Byte (enum = int)

    siehe unten

    Bitte ein Bit schrieb:

    Aber warum macht man das ?

    weil man oder der compiler -fshort-enums 😉



  • weil man oder der compiler -fshort-enums ;)
                                            ^- nicht kennt
    


  • Ich schätze, dass -fshort-enums bei unvollständigen Typen (Vorausdeklarationen) zu ineffizientem Code führen kann. Außerdem benutzen manche enums nur als eine Form, Konstanten zu definieren, und interessieren sich nicht für den dadurch definierten Typ. Das ist schließlich C.



  • Das ist schließlich C.

    Arg...

    Man kann meines Erachtens einigermaßen sauber in C programmieren, aber diese Mikrooptmierung in C emfinde ich als unsauberen Code, eben wegen der mangelnden Typsicherheit.

    Selbst auf einem Mikrokontroller mit wenigen kByte Speicher (RAM, Flash) habe ich keine Rücksicht darauf genommen und es hat mich nicht gebissen (keine Speicher/ Timing Probleme). Da hat mich eher die Implementierungsgröße von sprintf auf dem Kontroller gestört.



  • Bitte ein Bit schrieb:

    Man kann meines Erachtens einigermaßen sauber in C programmieren, aber diese Mikrooptmierung in C emfinde ich als unsauberen Code, eben wegen der mangelnden Typsicherheit.

    Wenn du Typsicherheit willst, nimm C++ 🤡



  • Jop, in C++ gibt's sogar

    enum type1 : unsigned char
    {
    	blubb1 = 55, 
    	blubb2 = 42, 
    };
    
    enum class type2 : unsigned short
    {
    	blubb3, 
    	blubb4, 
    };
    
    int main()
    {
    	type1 t1 = blubb2;
    	type2 t2 = type2::blubb3;
    	t1 = t2; // fehler
    	t2 = t1; // fehler
    	std::cout << t1 << '\n'; // wird als Zahl ausgegeben
    	std::cout << t2 << '\n'; // fehler
    	blubb1;
    	blubb3; // fehler, falscher namespace
    }
    

    Mikrooptimierungen und dazu noch sauber. 😋 👍


Anmelden zum Antworten