Gewerkschaftstyp

Im Informatik, a Union ist ein Wert Das kann mehrere Darstellungen oder Formate in derselben Position in haben Erinnerung; das besteht aus a Variable das kann so ein haben Datenstruktur. Etwas Programmiersprachen Unterstützen Sie Special Datentypen, genannt Gewerkschaftstypen, um solche Werte und Variablen zu beschreiben. Mit anderen Worten, in einer Gewerkschaftstypdefinition wird festgelegt, welche von einer Reihe von zulässigen primitiven Typen in ihren Fällen, z. B. "Float oder Long Ganzzahl", gespeichert werden kann. Im Gegensatz zu a Aufzeichnung (oder Struktur), die definiert werden könnten, um einen Schwimmer zu enthalten und eine Ganzzahl; In einer Gewerkschaft gibt es zu einem bestimmten Zeitpunkt nur einen Wert.

Eine Gewerkschaft kann als Speicherback vorgestellt werden, mit dem Variablen verschiedener Datentypen gespeichert werden. Sobald einem Feld ein neuer Wert zugeordnet ist, werden die vorhandenen Daten mit den neuen Daten überschrieben. Der Speicherbereich, der den Wert speichert Bytes oder Wörter des Gedächtnisses), aber der Wert kann als einer von mehreren behandelt werden Abstrakte Datentypen, mit der Art des Wertes, der zuletzt in den Speicherbereich geschrieben wurde.

Im Typentheorie, eine Gewerkschaft hat eine Sumentyp; Dies entspricht Union Union in Mathematik.

Je nach Sprache und Typ kann in einigen Operationen ein Gewerkschaftswert verwendet werden, wie z. Abtretung und Vergleich für Gleichheit, ohne seinen spezifischen Typ zu kennen. Andere Operationen können dieses Wissen erfordern, entweder durch einige externe Informationen oder durch die Verwendung von a Tagged Union.

Untagte Gewerkschaften

Aufgrund der Einschränkungen ihrer Verwendung werden unabsaute Gewerkschaften im Allgemeinen nur in ungeduldigten Sprachen oder auf Typ-Unsafe-Weise bereitgestellt (wie in C). Sie haben den Vorteil gegenüber einfachen markierten Gewerkschaften, dass sie keinen Platz benötigen, um ein Datentyp -Tag zu speichern.

Der Name "Union" ergibt sich aus der formalen Definition des Typs. Wenn ein Typ als der angesehen wird einstellen Von allen Werten, die dieser Typ annehmen kann, ist ein Gewerkschaftstyp einfach der mathematische Union von seinen konstituierenden Typen, da es jeden Wert annehmen kann, kann jeder seiner Felder. Da eine mathematische Gewerkschaft Duplikate verwaltet, ist es unmöglich, wenn mehr als ein Bereich der Gewerkschaft einen einzigen gemeinsamen Wert annehmen kann, aus dem Wert, welches Feld zuletzt geschrieben wurde.

Eine nützliche Programmierfunktion der Gewerkschaften besteht jedoch darin, kleinere Datenelemente auf größere Manipulation zuzuordnen. Eine Datenstruktur, die zum Beispiel von 4 Bytes und einer 32-Bit-Ganzzahl besteht, kann eine Vereinigung mit einer nicht signierten 64-Bit-Ganzzahl bilden und somit leichter zu Vergleichszwecken zugegriffen werden usw.

Gewerkschaften in verschiedenen Programmiersprachen

Algol 68

Algol 68 hat Gewerkschaften mit Tags versehen und verwendet eine Fallklausel, um den Bestandtyp zur Laufzeit zu unterscheiden und zu extrahieren. Eine Gewerkschaft, die eine andere Gewerkschaft enthält, wird als Set aller ihrer Bestandteile behandelt.

Die Syntax des C/C ++ - Gewerkschaftstyps und der Begriff der Abgüsse wurden aus Algol 68 abgeleitet, allerdings in einer nicht getagelten Form.[1]

C/C ++

Im C und C ++, nicht getagierte Gewerkschaften werden fast genau wie Strukturen ausgedrückt (StrukturenStrukturen), außer dass jedes Datenelement am selben Ort im Speicher beginnt. Die Datenelemente, wie in Strukturen, müssen keine primitiven Werte sein und können tatsächlich Strukturen oder sogar andere Gewerkschaften sein. C ++ (seitdem C ++ 11) Ermöglicht es auch, dass ein Datenmitglied einen Typ mit einem vollwertigen Konstruktor/Destruktor und/oder Kopierkonstruktor oder einen nicht trivialen Kopienzuweisungsbetreiber hat. Zum Beispiel ist es möglich, den Standard C ++ zu haben Saite Als Mitglied einer Gewerkschaft.

Wie eine Struktur sind alle Mitglieder einer Gewerkschaft standardmäßig öffentlich. Die Schlüsselwörter Privatgelände, Öffentlichkeit, und geschützt kann in einer Struktur oder einer Gewerkschaft genauso verwendet werden, wie sie innerhalb einer Klasse zur Definition privater, öffentlicher und geschützter Zugangs zu sich genommen werden.

Die primäre Verwendung einer Gewerkschaft ermöglicht den Zugriff auf einen gemeinsamen Ort durch verschiedene Datentypen, z. Geben Sie Punning ein. Gewerkschaften können auch niedrige Ebene liefern Polymorphismus. Es gibt jedoch keine Überprüfung der Typen, daher liegt es an dem Programmierer, sicherzustellen, dass auf die richtigen Felder in verschiedenen Kontexten zugegriffen werden. Das relevante Feld einer Gewerkschaftsvariablen wird typischerweise durch den Zustand anderer Variablen bestimmt, möglicherweise in einer umschließenden Struktur.

Ein gemeinsames C -Programmier -Idiom verwendet Gewerkschaften, um das auszusetzen, was C ++ nennt a neu interpret_cast, durch Zuweisen eines Feldes einer Gewerkschaft und Lesen von einem anderen, wie im Code, der von der rohen Darstellung der Werte abhängt. Ein praktisches Beispiel ist das Methode zur Berechnung von Quadratwurzeln mithilfe der IEEE -Darstellung. Dies ist jedoch keine sichere Verwendung von Gewerkschaften im Allgemeinen.

Struktur- und Gewerkschaftsspezifizierer haben die gleiche Form. [. . . ] Die Größe einer Gewerkschaft reicht aus, um die größten ihrer Mitglieder zu enthalten. Der Wert von höchstens einer der Mitglieder kann in einer Gewerkschaft gespeichert werden Objekt jederzeit. Ein Zeiger auf ein Gewerkschaftsobjekt, das geeignet konvertiert, zeigt auf jedes seiner Mitglieder (oder wenn ein Mitglied ein Bitfeld ist, dann auf die Einheit, in der es sich befindet), und umgekehrt.

-ANSI/ISO 9899: 1990 (der ANSI C -Standard) Abschnitt 6.5.2.1

Anonyme Vereinigung

In C ++, C11und als nicht standardmäßige Erweiterung in vielen Compilern können auch Gewerkschaften anonym sein. Auf ihre Datenmitglieder müssen nicht verwiesen werden, auf die direkt zugegriffen werden. Sie haben einige Einschränkungen im Gegensatz zu traditionellen Gewerkschaften: In C11 müssen sie Mitglied einer anderen Struktur oder Gewerkschaft sein.[2] und in C ++ können sie nicht haben Methoden oder Zugriffsspezifizierer.

Wenn Sie einfach den Unterrichtsabschnitt der Syntax weglassen, ist es keine Gewerkschaft zu einer anonymen Vereinigung. Damit sich eine Gewerkschaft als anonyme Gewerkschaft qualifizieren kann, darf die Erklärung kein Objekt erklären. Beispiel:

#enthalten  #enthalten  int hauptsächlich() {   Union {   schweben f;   std::uint32_t d; // geht davon aus, dass der Schwimmer 32 Bit breit ist   };   f = 3.14f;   std::Cout << "Hexadezimale Darstellung von 3.14F:"    << std::verhexen << d << '\n'; } 

Anonyme Gewerkschaften sind auch in C nützlich Struktur Definitionen, um ein Gefühl des Namensspazierens zu vermitteln.[3]

Transparente Gewerkschaft

In Compilern wie GCC, Clang und IBM XL C für AIX, a transparent_union Das Attribut ist für Gewerkschaftstypen verfügbar. In der Union enthaltene Typen können in einem Funktionsaufruf transparent in den Gewerkschaftstyp selbst konvertiert werden, sofern alle Typen die gleiche Größe haben. Es ist hauptsächlich für die Funktion mit mehreren Parameterschnittstellen bestimmt, eine Verwendung, die durch frühe Unix-Erweiterungen und später-Re-Stramping-Standardisation erforderlich ist.[4]

Cobol

Im Cobol, Gewerkschaftsdatenelemente werden auf zwei Arten definiert. Der erste verwendet die Umbenannt (66 Stufe) Schlüsselwort, das ein zweites alphanumerisches Datenelement effektiv auf demselben Speicherort wie ein vorhergehender Datenelement ordnet. Im Beispielcode unten, Datenelement Person-Rec ist definiert als eine Gruppe, die eine andere Gruppe und ein numerisches Datenelement enthält. Persondaten ist definiert als ein alphanumerischer Datenelement, das umbenannt wird Person-RecDie Behandlung der Daten Bytes wurde darin als Charakterdaten fortgesetzt.

  01 Person-Rec.   05 NAME DER PERSON.     10 Personenbezogene Name  Bild x (12).     10 PERSONAME-NAME-FURST  Bild x (16).     10 PERSONAME-MID  Bild x.   05 Person-id  Bild 9 (9) Gepacktes Dezimal.      01 Persondaten  Umbenannt Person-Rec. 

Der zweite Weg, einen Gewerkschaftstyp zu definieren, besteht Neu definiert Stichwort. Im Beispielcode unten, Datenelement Verun-Num ist definiert als eine 2-Byte-binäre Ganzzahl mit einer Versionsnummer. Ein zweiter Datenelement Verkehrs wird als alphanumerische Variable mit zwei Zeichen definiert. Da ist der zweite Artikel neu definiert Während des ersten Elements teilen sich die beiden Elemente die gleiche Adresse im Speicher und teilen daher die gleichen zugrunde liegenden Datenbytes. Der erste Element interpretiert die beiden Datenbytes als Binärwert, während der zweite Element die Bytes als Zeichenwerte interpretiert.

  01 Verussel.   05 Verun-Num  Bild S9 (4) Comp.   05 Verkehrs  Bild x (2)    Neu definiert Verun-Num 

Pascal

Im PascalEs gibt zwei Möglichkeiten, Gewerkschaften zu schaffen. Einer ist der Standardweg durch einen Variante -Datensatz. Das zweite ist ein nicht standardmäßiges Mittel, um eine Variable als absolut zu deklarieren, was bedeutet, dass sie an derselben Speicherstelle wie eine andere Variable oder an einer absoluten Adresse platziert wird. Während alle Pascal -Compiler Variantenaufzeichnungen unterstützen, unterstützen nur einige absolute Variablen.

Für die Zwecke dieses Beispiels sind die folgenden ganzzahligen Typen: a Byte IS 8-Bit, a Wort ist 16 Bit und ein ganze Zahl ist 32 Bit.

Das folgende Beispiel zeigt die nicht standardmäßige absolute Form:

Var  A: Ganze Zahl;  B: Array[1..4] von Byte absolut A;  C: Ganze Zahl absolut 0; 

Im ersten Beispiel kartiert jedes der Elemente des Array B zu einem der spezifischen Bytes der Variablen A. Im zweiten Beispiel wird die Variable C der exakten Maschinenadresse 0 zugeordnet.

Im folgenden Beispiel hat ein Datensatz Varianten, von denen einige den gleichen Ort wie andere teilen:

TYP  Tsystem = Aufzeichnung  Jahr, Monat, Wochentag, Tag : Wort;  Stunde, Minute, Zweite, Millisekunde: Wort;  Ende;    Tperson = AUFZEICHNUNG  Vorname, Nachname: Saite;  Geburtsdatum: Tsystem;  Fall ist schwanger: Boolesche von   Stimmt: (Veraltet:Tsystem);  FALSCH: (ISPLANNINGPregnancy: Boolesche);  ENDE; 

Pl/i

Im Pl/i Dann war der ursprüngliche Begriff für eine Gewerkschaft Zelle,[5] Dies wird immer noch als Synonym für Union von mehreren Compilern akzeptiert. Die Gewerkschaftserklärung ähnelt der Strukturdefinition, bei der Elemente auf derselben Ebene innerhalb der Gewerkschaftserklärung dieselbe Lagerung belegen. Elemente der Gewerkschaft können jeder Datentyp sein, einschließlich Strukturen und Array.[6]: Pp192–193 Hier belegen Vers_num und Vers_Bytes die gleichen Speicherorte.

  1 Vers_info  Union,  5 Vers_num  Fest binär,  5 Vers_Bytes  Bild '(2) a'; 

Eine Alternative zu einer Gewerkschaftserklärung ist das definierte Attribut, das alternative Speichererklärungen ermöglicht. Die Datentypen der Basis und definierten Variablen müssen jedoch übereinstimmen.[6]: S. 289–293

Syntax und Beispiel

C/C ++

In C und C ++ lautet die Syntax:

Union <Name> {   <Datentyp>  <1st Variable Name>;   <Datentyp>  <2nd Variable Name>;   .   .   .   <Datentyp>  <nth Variable Name>; } <Union Variable Name>; 

Eine Struktur kann auch ein Mitglied einer Gewerkschaft sein, wie das folgende Beispiel zeigt:

Union Name1 {   Struktur Name2   {     int  a;   schweben  b;   verkohlen  c;   } Svar;   int  d; } Uvar; 

Dieses Beispiel definiert eine Variable Uvar als Gewerkschaft (markiert als Name1), die zwei Mitglieder enthält, eine Struktur (markiert als Name2) genannt Svar (was wiederum drei Mitglieder enthält) und eine ganzzahlige Variable benannt d.

Gewerkschaften können innerhalb von Strukturen und Arrays auftreten und umgekehrt:

Struktur {     int Flaggen;   verkohlen *Name;   int Utype;   Union {   int Ival;   schweben fval;   verkohlen *sval;   } u; } Symtab[Nsym]; 

Die Zahl ival wird als bezeichnet als symtab [i] .u.ival und das erste Zeichen von String sval von einem von *symtab [i] .u.sval oder symtab [i] .u.sval [0].

Php

Gewerkschaftstypen wurden in PHP 8.0 eingeführt.[7] Die Werte werden implizit mit einem Typ von der Sprache "markiert" und können von "Gettyp ()" abgerufen werden.

Klasse Beispiel {  Privatgelände int|schweben $ foo;  Öffentlichkeit Funktion SquareAndadd(schweben|int $ bar): int|schweben  {  Rückkehr $ bar ** 2 + $ das->Foo;  } } 

Python

Die Unterstützung für die Typisierung wurde in Python 3.5 eingeführt.[8] Die neue Syntax für Gewerkschaftstypen wurde in Python 3.10 eingeführt.[9]

Klasse Beispiel:  Foo = 0  def square_and_add(selbst, Bar: int | schweben) -> int | schweben:  Rückkehr Bar ** 2 + selbst.Foo 

Typoskript

Gewerkschaftstypen werden in Typenkripten unterstützt.[10] Die Werte werden implizit mit einem Typ von der Sprache "markiert" und können durch "typeof ()" abgerufen werden.

Funktion Nachfolger(n: Nummer | Bigint): Nummer | Bigint {  Rückkehr ++n } 

Unterschied zwischen Union und Struktur

Eine Gewerkschaft ist eine Klasse, von der alle Datenmitglieder innerhalb ihres Objekts derselben Adresse zugeordnet sind. Die Größe eines Objekts einer Gewerkschaft ist daher die Größe seines größten Datenmitglieds.

In einer Struktur werden alle Datenmitglieder an zusammenhängenden Speicherorten gespeichert. Die Größe eines Objekts einer Struktur ist daher die Größe der Summe aller Datenelemente.

Dieser Gewinn an Raumeffizienz ist zwar unter bestimmten Umständen wertvoll, hat jedoch einen hohen Sicherheitskosten: Die Programmlogik muss sicherstellen, dass sie das Feld nur zuletzt auf allen möglichen Ausführungspfaden liest. Die Ausnahme ist, wenn Gewerkschaften für verwendet werden Typumwandlung Typ: In diesem Fall wird ein bestimmtes Feld geschrieben und das anschließende Lesefeld ist absichtlich unterschiedlich.

Als Beispiel, das diesen Punkt veranschaulicht, die Erklärung

Struktur Foo { int a; schweben b; } 

Definiert ein Datenobjekt mit zwei Mitgliedern, die aufeinanderfolgende Speicherorte besetzen:

                "

Im Gegensatz dazu die Erklärung

Union Bar { int a; schweben b; } 

Definiert ein Datenobjekt mit zwei Mitgliedern, die denselben Speicherort belegen:

                "

Strukturen werden verwendet, wenn ein "Objekt" aus anderen Objekten besteht, wie ein Punktobjekt, das aus zwei Ganzzahlen besteht, wobei die X- und Y -Koordinaten sind:

Typedef Struktur {   int x;  // x und y sind getrennt   int y; } tpoint; 

Gewerkschaften werden in der Regel in einer Situation verwendet, in der ein Objekt eines von vielen Dingen, aber nur eines gleichzeitig sein kann, z.

Typedef Auflauf { Str, Int } type; Typedef Struktur {   type Typ;  // Typ ist getrennt.   Union {   int Ival;  // Ival und Sval besetzen das gleiche Gedächtnis.   verkohlen *sval;   }; } TVAL; 

Siehe auch

Verweise

  1. ^ Ritchie, Dennis M. (März 1993). "Die Entwicklung der C -Sprache". ACM Sigplan nennt. 28 (3): 201–208. doi:10.1145/155360.155580. Das von C verabschiedete Schema der Typuszusammensetzung schuldet Algol 68 beträchtliche Schulden, obwohl es möglicherweise nicht in einer Form entstand, die Algols Anhänger zustimmen würden. Der zentrale Begriff, den ich aus Algol erfasst hatte, war eine Typstruktur, die auf Atomtypen (einschließlich Strukturen) basiert und in Arrays, Zeiger (Referenzen) und Funktionen (Verfahren) zusammengesetzt war. Das Konzept der Gewerkschaften und Casts von Algol 68 hatte ebenfalls einen Einfluss, der später erschien.
  2. ^ "6.63 Unbenannte Struktur und Gewerkschaftsfelder". Abgerufen 2016-12-29.
  3. ^ Siebenmann., Chris. "CunionsFornamePaces". Utcc.utoronto.ca.
  4. ^ "Gemeinsame Typattribute: Transparent_union". Verwenden der GNU Compiler Collection (GCC).
  5. ^ IBM Corporation (März 1968). IBM System/360 PL/I Sprachspezifikationen (PDF). p. 52. Abgerufen 22. Januar, 2018.
  6. ^ a b IBM Corporation (Dezember 2017). Enterprise PL/I für Z/OS PL/I für AIX IBM -Entwickler für Z Systems PL/I für Windows Language Referenz (PDF). Abgerufen 22. Januar, 2018.
  7. ^ Karunaratne, Ayesh. "PHP 8.0: Gewerkschaftstypen". Php.Watch. Abgerufen 30. November 2020.
  8. ^ "Typing - Unterstützung für Typ -Hinweise - Python 3.9.7 Dokumentation". docs.python.org. Abgerufen 8. September 2021.
  9. ^ "PEP 604 - Erlauben Sie Schreiben von Gewerkschaftstypen als x | y". Python.org. Abgerufen 8. September 2021.
  10. ^ "Handbuch - Gewerkschaften und Kreuzungstypen". www.typescriptlang.org. Abgerufen 30. November 2020.

Externe Links