union vs reinterpret_cast



  • Immer wieder sehe ich Leute eine union verwenden, wenn sie irgendwelche exotischen Casts durchführen wollen. Warum denn nicht gleich ein reinterpret_cast? Was macht denn die union besser?

    Grüßle



  • Union für Casts ist nicht standardkonform. Man darf aus einer Union nur den Member lesen, den man zuletzt gesetzt hat.

    Insofern erübrigt sich die Frage. Solche Programmierer kommen sich einfach nur zu schlau vor 😉



  • Es funktioniert aber meistens. 🙂 Hier Wikipedia: http://en.wikipedia.org/wiki/Union_(computer_science) , dort steht

    One common C programming idiom uses unions to perform what C++ calls a reinterpret_cast, by assigning to one field of a union and reading from another, as is done in code which depends on the raw representation of the values. A practical example is the method of computing square roots using the IEEE representation. This is not, however, a safe use of unions in general.

    Structure and union specifiers have the same form. [ . . . ] The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at any time. A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit-field, then to the unit in which it resides), and vice versa.
    —ANSI/ISO 9899:1990 (the ANSI C standard) Section 6.5.2.1



  • Naja, wenn man solche exotischen Casts durchführen will, bewegt man sich sowieso etwas abseits des durch den Standard garantierten Verhaltens. Diese Probleme können weder reinterpret_cast noch unions lösen.

    In der Praxis gibt es keinen wirklichen Unterschied zwischen diesen Varianten, und ich benutze Unions in solchen Fällen eigentlich nur, weil mir die Syntax besser gefällt. Wenn man ganz kleinkariert sein will, kann man darauf hinweisen, dass bei Unions immerhin einige Garantien bestehen, die reinterpret_cast nicht bietet (diese drehen sich im Wesentlichen um trap representations), aber mir ist bislang keine Plattform untergekommen, auf der reinterpret_cast sich nicht genau so vierhielte. Ich habe allerdings keine extensiven Tests durchgeführt, weil ich der Ansicht bin, dass man solche Schweinereien tunlichst sein lassen sollte, wenn es auch anders geht.

    Sobald man sich einmal entschieden hat, das Typsystem zu unterwandern, ist die Art, auf die man es tut, für mein Verständnis Geschmackssache. Es ist ein bisschen wie die Frage, ob man besser eine Armbrust oder ein Gewehr nehmen sollte, um sich in den Fuß zu schießen.



  • 314159265358979 schrieb:

    Immer wieder sehe ich Leute eine union verwenden, wenn sie irgendwelche exotischen Casts durchführen wollen. Warum denn nicht gleich ein reinterpret_cast? Was macht denn die union besser?

    Mit beiden Varianten bist Du ganz schnell im UB-Land, laut Standard. Der GCC macht aber zusätzliche Garantien, mit denen "type punning" per union möglich wird. Verwendest Du hingegen den reinterpret_cast beim GCC, wird Dich sehr wahrscheinlich eine aggressive Optimierungsstufe in den Arsch beißen, weil Du ja die aliasing-Regeln verletzt, die der Optimierer ausnutzt, um der Effizienz wegen den Code etwas umzusortieren ...


Anmelden zum Antworten