Was ist ein opaker Datentyp.



  • Hallo,
    kann mir einer erklären, was ein opaker Datenyp ist. Ich habe gelesen, dass meist Mutex-Variablen von solch einem Typen sind, was bedeutet das?

    Danke euch 🙂


  • Mod

    Wikipedia hat dazu einen Eintrag: Opaque data type

    Da die Interna des jeweiligen Objektes an der Stelle, an der es verwendet wird, dem Compiler unbekannt sind, kann dieser keine Annahmen über dessen Verhalten machen, was bestimmte Optimierungen ausschliesst (primär geht es dabei um die Umordnung von Schreib- und Leseoperationen, die sonst nach der as-if-Regel möglich wären). Das ist in vielen Fällen ausreichend, um das gewünschte Verhalten mit mehreren Threads zu garantieren, obwohl die Sprachsprezifikation bis vor kurzem so etwas wie Threads gar nicht kannte.



  • Interessant, wusste ich gar nicht.

    Also hängt es von der Stelle im Programm ab, ob ein Typ opak oder nicht ist?

    struct Type;
    //Hier ist Type (noch) opak
    
    struct Type
    {
        int a, b, c;
        //...
    };
    
    //Und hier ist er nicht opak (transparent).
    


  • Sone schrieb:

    Also hängt es von der Stelle im Programm ab, ob ein Typ opak oder nicht ist?

    Wenn der Typ irgendwo im Programm vollständig definiert wird, dann musst du davon ausgehen dass
    a) er möglicherweise im ganzen Programm "transparent" ist aber auch
    b) er möglicherweise an den Stellen wo er noch unvollständig ist doch "opaque" ist

    D.h. du kannst dich weder darauf verlassen dass der Compiler etwas nicht optimieren kann, weil der Typ noch unvollständig ist (gibt ja diverse "Whole Program Optimization" Techniken), noch kannst du dich darauf verlassen dass er es sicher optimieren kann.

    Darauf verlassen dass der Typ undurchsichtig ist kann man sich nur, wenn im ganzen Programm keine Definition vorkommt. Wie z.B. wenn man System-DLLs verwendet, bzw. allgemein DLLs von denen man weder Source noch LTCG-Object-Code hat.



  • Nein.



  • @Kellerautomat
    Deine Antworten sind wie immer sehr sinnfrei.
    Nein was?
    Und wieso?



  • Du bist mir zuvorgekommen. Ein opaquer Datentyp ist nicht gleich ein unvollstaendiger. Im Gegenteil, ein Opaquer Datentyp ist vollstaendig definiert, haelt aber intern nur z.B. einen void*. Im Prinzip das, was camper gesagt hat.



  • Warum einen void* nochmals kapseln? Fuer sind opaque Datentypen meist(immer) void*.


  • Mod

    Kellerautomat schrieb:

    Du bist mir zuvorgekommen. Ein opaquer Datentyp ist nicht gleich ein unvollstaendiger. Im Gegenteil, ein Opaquer Datentyp ist vollstaendig definiert, haelt aber intern nur z.B. einen void*. Im Prinzip das, was camper gesagt hat.

    Trotz des Namens (Datentyp) geht es eigentlich nicht um den internen Aufbau des Objektes selbst (der ist in der Regel bekannt), sondern um die Operationen, die auf diesem Typ definiert sind - die Interna dieser Funktionen dürfen dem Compiler an den relevanten Stellen nicht bekannt sein.



  • Dass die Funktionen in einer .cpp, einer externen Bibliothek oder sonstwo definiert sind, versteht sich, denke ich mal, von selbst. Das ist aber nicht das entscheidende Merkmal eines opaquen Datentyps.

    Und nur weil jemand irgendwo einen void* hat, der auf eine PetFactory zeigt, wird PetFactory noch lange nicht opaque. Wenn hingegen jemand PetFactory verwended, die intern einen void* hat, der auf ein impl Objekt zeigt, dann ist PetFacory opaque.



  • Kellerautomat, sorry, aber du hast es nicht verstanden.
    Lies nochmal die Antworten von camper bzw. den von ihm zitierten Wikipedia-Artikel.


Log in to reply