Style-off



  • wxSkip schrieb:

    @volkard: Meinst du GetStringNumberType()?

    Nein, nur GetLeadingOnesCount().



  • volkard schrieb:

    wxSkip schrieb:

    @volkard: Meinst du GetStringNumberType()?

    Nein, nur GetLeadingOnesCount().

    Na ja, ich muss dir dazu sagen, dass BIN() ein Makro ist, das ein Template aufruft, welches die Zahl statisch konvertiert. Diese Funktion wird relativ oft bei UFT-8-Decoding aufgerufen, von daher wollte ich sie entsprechend optimieren.

    ///bin-to-hex static conversion
    
    template<uint64_t param> struct hex_helper
    {
        enum
        {
            val = (uint16_t(bool(param & 0x1000000000000000ull)) << 15)
            | (uint16_t(bool(param & 0x100000000000000ull)) << 14)
            | (uint16_t(bool(param & 0x10000000000000ull)) << 13)
            | (uint16_t(bool(param & 0x1000000000000ull)) << 12)
            | (uint16_t(bool(param & 0x100000000000ull)) << 11)
            | (uint16_t(bool(param & 0x10000000000ull)) << 10)
            | (uint16_t(bool(param & 0x1000000000ull)) << 9)
            | (uint16_t(bool(param & 0x100000000ull)) << 8)
            | (uint16_t(bool(param & 0x10000000ull)) << 7)
            | (uint16_t(bool(param & 0x1000000ull)) << 6)
            | (uint16_t(bool(param & 0x100000ull)) << 5)
            | (uint16_t(bool(param & 0x10000ull)) << 4)
            | (uint16_t(bool(param & 0x1000ull)) << 3)
            | (uint16_t(bool(param & 0x100ull)) << 2)
            | (uint16_t(bool(param & 0x10ull)) << 1)
            | (uint16_t(bool(param & 0x1ull)))
        };
    };
    
    #define BIN(value) (utils::hex_helper<(0x##value##ull)>::val)
    

    Sieht allerdings auch nicht besser aus... 🙄



  • ich verstehe

    void bla(foo)
    {
        last;
    }
    

    trotzdem nicht ganz - daß die auf void bla(foo) folgende Zeile die Anfangszeile des Funktionsinhalts ist, ist doch nicht so überraschend, und wird außerdem durch die Einrückung (ich kenne niemanden, der nicht einrückt) sowieso schon optisch hervorgehoben. Warum noch eine zweite Hervorhebung durch Leerzeile.



  • !rr!rr_. schrieb:

    ich verstehe

    void bla(foo)
    {
        last;
    }
    

    trotzdem nicht ganz - daß die auf void bla(foo) folgende Zeile die Anfangszeile des Funktionsinhalts ist, ist doch nicht so überraschend, und wird außerdem durch die Einrückung (ich kenne niemanden, der nicht einrückt) sowieso schon optisch hervorgehoben. Warum noch eine zweite Hervorhebung durch Leerzeile.

    1. Gewohnheitssache.
    2. Ich finde es optisch schöner, weil ich es gewöhnt bin und weil die Klammern auf gleicher Höhe sind.
    3. Es ist einfacher mit der Code::Blocks Sonderzeichenergänzung zu kombinieren.



  • wxSkip schrieb:

    ...

    Hast Du gemessen, daß asm bsr oder __builtin_clz langsamer sind?



  • volkard schrieb:

    wxSkip schrieb:

    ...

    Hast Du gemessen, daß asm bsr oder __builtin_clz langsamer sind?

    Was ist das? Sieht nicht nach Standard-C++ aus.

    EDIT: __builtin_clz ist genau das Gegenteil von dem, was ich brauche (gibt führende Nullen zurück), asm bsr lässt sich leider nicht so gut finden. Auf GCC-Spezifische Sachen würde ich höchstens mit einem #ifdef zugreifen, inline-Assembler fände ich nicht so gut.



  • wxSkip schrieb:

    volkard schrieb:

    wxSkip schrieb:

    ...

    Hast Du gemessen, daß asm bsr oder __builtin_clz langsamer sind?

    Was ist das? Sieht nicht nach Standard-C++ aus.

    Und? Für außergewöhliche Architekturen kann man ja suboptimalen Standard-Code machen.

    size_t utils::binary::GetLeadingZerosCount(char_t in)
    {
        return GetLeadingOnesCount(~in);
    }
    


  • Ah, gut... (*hirn an*)
    char_t ist bloß leider meistens 32 Bits groß und der char ja bekanntlich 8 Bit... während unsigned int eher undefiniert groß ist :p ... Mal schauen.
    Und wenn ich den char von GetLeadingOnesCount in ein unsigned int konvertiere, dann __builtin_clz aufrufe und dann vom Ergebnis (sizeof(unsigned int)-sizeof(char)) * 8 abziehe, habe ich da so meine Zweifel, ob das schneller ist, zumal bei UTF-8 in den meisten Fällen gleich die erste if-Bedingung true liefern wird.



  • wxSkip schrieb:

    Ah, gut... (*hirn an*)
    char_t ist bloß leider meistens 32 Bits groß und der char ja bekanntlich 8 Bit... während unsigned int eher undefiniert groß ist :p ... Mal schauen.

    Ups, eine Asymmetrie der beiden Funktionen, die mir nicht aufgefallen ist (Gefahr).
    (Vielleicht auch hier schauen. http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn )

    wxSkip schrieb:

    Und wenn ich den char von GetLeadingOnesCount in ein unsigned int konvertiere, dann __builtin_clz aufrufe und dann vom Ergebnis (sizeof(unsigned int)-sizeof(char)) * 8 abziehe, habe ich da so meine Zweifel, ob das schneller ist, zumal bei UTF-8 in den meisten Fällen gleich die erste if-Bedingung true liefern wird.

    Das wäre ein schöner Kommentar für die GetLeadingOnesCountByIfCascadeForUTF8AssumingAlmostAllInputReturningZero().

    Nicht, daß es wirkt, als wolle ich Deinen Code nur schlechtmachen.
    Erstmal 👍 für Deinen Stil. Den kann ich gut lesen.



  • @Eisflamme: Du übersiehst da ein Problem: Wenn du die Zeile mit der schließenden Klammer änderst, musst du hinten wieder Leerzeichen hinzufügen/löschen und falls sie länger wird als die vorherige, musst du auch noch Leerzeichen in der vorigen Zeile hinzufügen.

    Wie kommst Du darauf, dass ich das übersehe. Aber besser ein klein bisschen mehr Änderungsaufwand als die Lesbarkeit des Codes torpedieren. Ich finde es nach wie vor schrecklich, { keine eigene Zeile zu spendieren und ich erkenne die Blöcke einfach nicht. Ausnahme ist, wenn die } in der gleichen Zeile steht.



  • volkard schrieb:

    wxSkip schrieb:

    Ah, gut... (*hirn an*)
    char_t ist bloß leider meistens 32 Bits groß und der char ja bekanntlich 8 Bit... während unsigned int eher undefiniert groß ist :p ... Mal schauen.

    Ups, eine Asymmetrie der beiden Funktionen, die mir nicht aufgefallen ist (Gefahr).
    (Vielleicht auch hier schauen. http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn )

    wxSkip schrieb:

    Und wenn ich den char von GetLeadingOnesCount in ein unsigned int konvertiere, dann __builtin_clz aufrufe und dann vom Ergebnis (sizeof(unsigned int)-sizeof(char)) * 8 abziehe, habe ich da so meine Zweifel, ob das schneller ist, zumal bei UTF-8 in den meisten Fällen gleich die erste if-Bedingung true liefern wird.

    Das wäre ein schöner Kommentar für die GetLeadingOnesCountByIfCascadeForUTF8AssumingAlmostAllInputReturningZero().

    Nicht, daß es wirkt, als wolle ich Deinen Code nur schlechtmachen.
    Erstmal 👍 für Deinen Stil. Den kann ich gut lesen.

    Die Seite ist ja lustig, was es alles gibt!
    Gut, über den Funktionsnamen könnte man sich streiten...

    Ich finde es auch interessant, mal in altem "unschönen" Code zu lesen, dafür umso weniger, ihn zu verbessern 😃


Anmelden zum Antworten