Typ Unie - Union type

v počítačová věda, a unie je hodnota které mohou mít v rámci stejné pozice v libovolném z několika zastoupení nebo formátů Paměť; který se skládá z a proměnná které mohou držet takové a datová struktura. Nějaký programovací jazyky speciální podpora typy dat, volala typy spojení, popsat tyto hodnoty a proměnné. Jinými slovy, definice typu spojení určí, který z řady povolených primitivních typů může být uložen v jeho instancích, např. „Float nebo long integer“. Na rozdíl od a záznam (nebo struktura), kterou lze definovat tak, aby obsahovala plovák a celé číslo; v unii je v daném okamžiku pouze jedna hodnota.

Sjednocení lze zobrazit jako část paměti, která se používá k ukládání proměnných různých datových typů. Jakmile je poli přiřazena nová hodnota, jsou stávající data přepsána novými daty. Paměťová oblast uchovávající hodnotu nemá žádný vnitřní typ (kromě pouze bajtů nebo slova paměti), ale s hodnotou lze zacházet jako s jednou z několika abstraktní datové typy, mající typ hodnoty, která byla naposledy zapsána do oblasti paměti.

v teorie typů, odbor má typ součtu; to odpovídá disjunktní unie v matematice.

V závislosti na jazyce a typu může být sjednocující hodnota použita v některých operacích, například úkol a srovnání pro rovnost, aniž byste věděli jeho konkrétní typ. Jiné operace mohou vyžadovat tyto znalosti, a to buď pomocí některých externích informací, nebo použitím a označená unie.

Neoznačené odbory

Z důvodu omezení jejich použití jsou neoznačené odbory obecně poskytovány pouze v netypových jazycích nebo způsobem, který není bezpečný pro typ (jako v C ). Mají tu výhodu oproti jednoduchým označeným svazkům, že nevyžadují prostor pro uložení značky datového typu.

Název „unie“ vychází z formální definice typu. Pokud je typ považován za soubor ze všech hodnot, které tento typ může převzít, je sjednocený typ jednoduše matematický unie jejích typů, které vytvářejí, protože může nabývat jakékoli hodnoty kteréhokoli ze svých polí. Protože také matematické sjednocení zahodí duplikáty, může-li více než jedno pole sjednocení nabývat jedné společné hodnoty, nelze podle samotné hodnoty zjistit, které pole bylo naposledy zapsáno.

Jednou z užitečných programovacích funkcí odborů je však mapování menších datových prvků na větší pro snazší manipulaci. Datová struktura, která se skládá například ze 4 bajtů a 32bitového celého čísla, může vytvořit spojení s nepodepsaným 64bitovým celým číslem, a tak k němu snadněji získat přístup pro účely srovnání atd.

Odbory v různých programovacích jazycích

ALGOL 68

ALGOL 68 označil odbory a k rozlišování a extrahování typu složky za běhu používá klauzuli případu. S unií obsahující další unii se zachází jako s množinou všech jejích možností.

Syntaxe unijního typu C / C ++ a pojem casts byla odvozena z ALGOL 68, i když v neoznačené podobě.[1]

C / C ++

v C a C ++, neoznačené odbory jsou vyjádřeny téměř přesně jako struktury (struktury ), kromě toho, že každý datový člen začíná na stejném místě v paměti. Datové členy, stejně jako ve strukturách, nemusí být primitivními hodnotami a ve skutečnosti to mohou být struktury nebo dokonce jiné odbory. C ++ (od C ++ 11 ) také umožňuje, aby datovým členem byl jakýkoli typ, který má plnohodnotný konstruktor / destruktor a / nebo kopírovací konstruktor, nebo netriviální operátor přiřazení kopie. Například je možné mít standardní C ++ tětiva jako člen odborů.

Stejně jako struktura jsou všichni členové unie ve výchozím nastavení veřejné. Klíčová slova soukromé, veřejnost, a chráněný mohou být použity uvnitř struktury nebo sjednocení přesně stejným způsobem, jako jsou použity uvnitř třídy pro definování soukromého, veřejného a chráněného přístupu členů.

Primárním použitím spojení je umožnění přístupu ke společnému umístění různými datovými typy, například přístup k hardwarovým vstupům / výstupům, bitové pole a sdílení slov, nebo typ punning. Odbory mohou také poskytovat nízkou úroveň polymorfismus. Neexistuje však žádná kontrola typů, takže je na programátorovi, aby se ujistil, že ke správným polím se přistupuje v různých kontextech. Relevantní pole sjednocující proměnné je obvykle určeno stavem jiných proměnných, případně v uzavírající struktuře.

Jeden běžný programovací idiom jazyka C používá odbory k provádění toho, co C ++ nazývá a reinterpret_cast, přiřazením k jednomu poli sjednocení a čtením z jiného, ​​jak se to děje v kódu, který závisí na hrubé reprezentaci hodnot. Praktickým příkladem je metoda výpočtu druhé odmocniny pomocí reprezentace IEEE. Nejedná se však obecně o bezpečné používání odborů.

Specifikátory struktury a sjednocení mají stejnou formu. [. . . ] Velikost unie je dostatečná, aby obsahovala největší z jejích členů. Hodnota nejvýše jednoho z členů může být uložena v unii objekt kdykoliv. Ukazatel na sjednocující objekt, vhodně převedený, ukazuje na každého z jeho členů (nebo je-li členem bitové pole, pak na jednotku, ve které se nachází) a naopak.

— ANSI / ISO 9899: 1990 (standard ANSI C) oddíl 6.5.2.1

Anonymní unie

V C ++, C11 a jako nestandardní rozšíření v mnoha překladačech mohou být odbory také anonymní. Na jejich datové členy není třeba odkazovat, místo toho k nim přistupujete přímo. Na rozdíl od tradičních odborů mají určitá omezení: v C11 musí být členem jiné struktury nebo odboru,[2] a v C ++ nemohou mít metody nebo specifikátory přístupu.

Jednoduše vynechání části syntaxe s názvem třídy nedělá z odboru anonymní odbor. Aby se odbor kvalifikoval jako anonymní odbor, deklarace nesmí deklarovat objekt.

#zahrnout <iostream>#zahrnout <cstdint>int hlavní() {   použitím jmenný prostor std;   unie {      plovák F;      uint32_t d; // Předpokládá, že float je široký 32 bitů   };   F = 3.14f;   cout << "Binární zastoupení 3.14 =" << hex << d << konec;   vrátit se 0;}

Transparentní unie

V kompilátorech podobných Unixu, jako jsou GCC, Clang a IBM XL C pro AIX, a transparent_union atribut je k dispozici pro typy spojení. Typy obsažené v unii lze transparentně převést na samotný unijní typ ve volání funkce za předpokladu, že všechny typy mají stejnou velikost. Je určen hlavně pro funkci s víceparametrovými rozhraními, použití vyžadované časnými rozšířeními Unixu a pozdější re-standarisation.[3]

COBOL

v COBOL, sjednocené datové položky jsou definovány dvěma způsoby. První používá RENAMES Klíčové slovo (úroveň 66), které efektivně mapuje druhou alfanumerickou datovou položku na stejné místo v paměti jako předchozí datová položka. V níže uvedeném příkladu kódu datová položka OSOBNÍ REC je definována jako skupina obsahující jinou skupinu a číselnou datovou položku. OSOBNÍ ÚDAJE je definována jako alfanumerická datová položka, která se přejmenovává OSOBNÍ REC, zpracování datových bajtů pokračujících v něm jako znakových dat.

  01  OSOBNÍ REC.05  OSOBNÍ JMÉNO.    10  OSOBNÍ JMÉNO - POSLEDNÍ    PIC X (12).    10  OSOBNÍ JMÉNO - PRVNÍ   PIC X (16).    10  OSOBNÍ JMÉNO-MID     PIC X.05  OSOBNÍ ID               PIC 9 (9) BALENO-DECIMÁLNĚ.    01  OSOBNÍ ÚDAJE                 RENAMES OSOBNÍ REC.

Druhým způsobem, jak definovat typ spojení, je použití REDEFINY klíčové slovo. V níže uvedeném příkladu kódu datová položka VERS-NUM je definováno jako dvoubajtové binární celé číslo obsahující číslo verze. Druhá datová položka VERZE BYTY je definována jako dvoumístná alfanumerická proměnná. Protože druhá položka je předefinováno nad první položkou dvě položky sdílejí stejnou adresu v paměti, a proto sdílejí stejné podkladové datové bajty. První položka interpretuje dva datové bajty jako binární hodnotu, zatímco druhá položka interpretuje bajty jako hodnoty znaků.

  01  VERS-INFO.05  VERS-NUM        PIC S9 (4) COMP.05  VERZE BYTY      PIC X (2) REDEFINY VERS-NUM

PL / I.

v PL / I. pak původní výraz pro unii byl buňka,[4] který je stále přijímán jako synonymum pro sjednocení několika kompilátory. Deklarace sjednocení je podobná definici struktury, kde prvky na stejné úrovni v deklaraci sjednocení zabírají stejné úložiště. Prvky sjednocení mohou být jakýkoli datový typ, včetně struktur a pole.[5]:pp192–193 Zde vers_num a vers_bytes zabírají stejná umístění úložiště.

  1  vers_info         unie,     5 vers_num        pevný binární,     5 vers_bytes      obr '(2) A';

Alternativou k sjednocovací deklaraci je atribut DEFINED, který umožňuje alternativní deklarace úložiště, avšak datové typy základních a definovaných proměnných se musí shodovat.[5]:str. 289–293

Syntaxe a příklad

V C a C ++ je syntaxe:

unie <název>{    <datový typ>  <1Svatý proměnná název>;    <datový typ>  <2nd proměnná název>;    .    .    .    <datový typ>  <n proměnná název>;} <unie proměnná název>;

Struktura může být také členem odboru, jak ukazuje následující příklad:

unie jméno1{    struktur jméno2    {          int     A;        plovák   b;        char    C;    } svar;    int     d;} uvar;

Tento příklad definuje proměnnou uvar jako odbor (označeno jako jméno1), který obsahuje dva členy, strukturu (označenou jako jméno2) pojmenovaný svar (který zase obsahuje tři členy) a celočíselnou proměnnou s názvem d.

Odbory se mohou vyskytovat v rámci struktur a polí a naopak:

struktur{      int vlajky;    char *název;    int utype;    unie {        int ival;        plovák fval;        char *sval;    } u;} symtab[NSYM];

Číslo ival je označováno jako symtab [i] .u.ival a první znak řetězce sval buď * symtab [i] .u.sval nebo symtab [i] .u.sval [0].

PHP

Typy Unie byly zavedeny v PHP 8.0.[6]

třída Příklad{    soukromé int|plovák $ foo;    veřejnost funkce squareAndAdd(plovák|int $ bar): int|plovák    {        vrátit se $ bar ** 2 + $ foo;    }}

Strojopis

Typy písma Union jsou podporovány v TypeScript.[7]

funkce náměstí(bar: plovák | int): int | plovák {    vrátit se bar ** 2;}

Rozdíl mezi unií a strukturou

Spojení je třída, jejíž všechny datové členy jsou mapovány na stejnou adresu v rámci jejího objektu. Velikost objektu sjednocení je tedy velikost jeho největšího datového člena.

Ve struktuře jsou všechny její datové členy uloženy na souvislých paměťových místech. Velikost objektu struktury je tedy velikost součtu všech jejích datových členů.

Tento zisk v efektivitě prostoru, i když je za určitých okolností cenný, přináší velkou cenu bezpečnosti: logika programu musí zajistit, aby četla pouze pole naposledy zapsané podél všech možných cest provádění. Výjimkou je situace, kdy se používají odbory převod typu: v tomto případě je zapsáno určité pole a následně čtené pole je záměrně odlišné.

Jako příklad ilustrující tento bod, deklaraci

struktur foo { int A; plovák b; }

definuje datový objekt se dvěma členy zabírajícími po sobě jdoucí paměťová místa:

                ┌─────┬──────┐ foo │ a │ b │ └───────┴─────┘ ↑ ↑ Adresa paměti: 0150 0154

Naproti tomu prohlášení

unie bar { int A; plovák b; }

definuje datový objekt se dvěma členy, kteří zabírají stejné místo v paměti:

                ┌─────┐┐ lišta │ a │ │ b │ └─────┘ ↑ Adresa paměti: 0150

Struktury se používají tam, kde se „objekt“ skládá z jiných objektů, jako je bodový objekt skládající se ze dvou celých čísel, přičemž ty jsou souřadnice xay:

typedef struktur {    int X;           // x a y jsou oddělené    int y;} tPoint;

Odbory se obvykle používají v situaci, kdy objektem může být jedna z mnoha věcí, ale pouze jedna po druhé, například systém úložiště typu:

typedef výčet { STR, INT } tType;typedef struktur {    tType typ;          // typ je samostatný.    unie {        int ival;       // ival a sval zabírají stejnou paměť.        char *sval;    };} tVal;

Viz také

Reference

  1. ^ Ritchie, Dennis M. (Březen 1993). „Vývoj jazyka C“. Oznámení ACM SIGPLAN. 28 (3): 201–208. doi:10.1145/155360.155580. Schéma typového složení přijaté C dluží Algolovi 68 značný dluh, i když se možná neobjevil ve formě, kterou by Algolovi přívrženci schválili. Ústředním pojmem, který jsem zachytil z Algolu, byla typová struktura založená na atomových typech (včetně struktur), složená do polí, ukazatelů (odkazy) a funkcí (procedur). Koncept odborů a odlitků Algolu 68 měl také vliv, který se objevil později.CS1 maint: ref = harv (odkaz)
  2. ^ „6,63 Nepojmenovaná struktura a pole odborů“. Citováno 2016-12-29.
  3. ^ "Společné atributy typu: transparent_union". Používání GNU Compiler Collection (GCC).
  4. ^ IBM Corporation (březen 1968). Specifikace jazyka IBM System / 360 PL / I (PDF). p. 52. Citováno 22. ledna 2018.
  5. ^ A b IBM Corporation (prosinec 2017). Enterprise PL / I pro z / OS PL / I pro AIX IBM Developer pro z Systems PL / I pro Windows Language Reference (PDF). Citováno 22. ledna 2018.
  6. ^ Karunaratne, Ayesh. „PHP 8.0: Union Types“. Hodinky PHP. Citováno 30. listopadu 2020.
  7. ^ „Příručka - odbory a typy křižovatek“. www.typescriptlang.org. Citováno 30. listopadu 2020.

externí odkazy