Кіріспе
Мәліметтер түрлерін сақтай алатын айнымалы. Компьютер ғылымында, одақ – жадыдағы бір орынға бірнеше түрлі бейнелеулер немесе форматтар орналастырылатын мән; ол мұндай дерек құрылымын сақтай алатын айнымалыдан тұрады. Кейбір бағдарламалау тілдері мұндай мәндер мен айнымалыларды сипаттау үшін арнайы дерек түрлерін, одақ түрлері деп атайды. Басқаша айтқанда, одақ түрінің анықтамасы оның мысалдарында қандай рұқсат етілген бастапқы түрлерді сақтауға болатынын көрсетеді, мысалы, "float немесе ұзын бүтін сан". Жазудың (немесе құрылымның) айырмашылығы, ол float және бүтін санды қамтиды деп анықталуы мүмкін; ал одақта кез келген уақытта тек бір ғана мән болады. Одақты әртүрлі дерек түрлерінің айнымалыларын сақтауға арналған жад бөлігі ретінде қарастыруға болады. Егер өріс жаңа мән алса, бұрынғы деректер жаңа деректермен жазылып түсіріледі. Мәнді сақтайтын жад аймағының өзіндік түрі жоқ (тек байттар немесе жад сөздерінен басқа), бірақ мәнді бірнеше абстрактілі дерек түрлерінің бірі ретінде қарастыруға болады, оның түрі жад аймағына соңғы рет жазылған мәннің түрімен анықталады. Типтер теориясында одақтың жиындық түрі бар; бұл математикадағы бөлінбейтін одаққа сәйкес келеді. Тіл мен типке байланысты, одақ мәні кейбір операцияларда, мысалы, теңдік үшін тағайындау және салыстыру кезінде, оның нақты түрін білмей қолданылуы мүмкін. Басқа операцияларға осы ақпарат сыртқы деректерден немесе белгіленген одақты пайдалану арқылы қажет болуы мүмкін.
In computer science, a union is a value that may have any of several representations or formats within the same position in memory; that consists of a variable that may hold such a data structure. Some programming languages support special data types, called union types, to describe such values and variables. In other words, a union type definition will specify which of a number of permitted primitive types may be stored in its instances, e. g., "float or long integer". In contrast with a record (or structure), which could be defined to contain both a float and an integer; in a union, there is only one value at any given time. A union can be pictured as a chunk of memory that is used to store variables of different data types. Once a new value is assigned to a field, the existing data is overwritten with the new data. The memory area storing the value has no intrinsic type (other than just bytes or words of memory), but the value can be treated as one of several abstract data types, having the type of the value that was last written to the memory area. In type theory, a union has a sum type; this corresponds to disjoint union in mathematics. Depending on the language and type, a union value may be used in some operations, such as assignment and comparison for equality, without knowing its specific type. Other operations may require that knowledge, either by some external information, or by the use of a tagged union.
Тагтысы жоқ одақтар
Шектеулері болғандықтан, белгіленбеген одақтар көбінесе тек типтелмеген тілдерде немесе тип қауіпсіз емес жолмен (мысалы, C тілінде) ұсынылады. Олар қарапайым тегтелген одақтарға қарағанда дерек типінің тегін сақтау үшін қосымша орын қажет етпейтін артықшылығына ие. "Одақ" атауы осы типтің формальды анықтамасынан шыққан. Егер типті ол қабылдай алатын барлық мәндер жиынтығы ретінде қарастырсақ, одақ типі – оны құрайтын типтердің математикалық одағы болып табылады, себебі ол өрістерінің кез келгенінің мәнін қабылдай алады. Сонымен қатар, математикалық одақ дубликаттарды жойғандықтан, егер одақтың бірнеше өрісі бірдей мәнді қабылдаса, тек мәнінен қай өріс соңғы рет жазылғанын анықтау мүмкін емес. Дегенмен, одақтардың пайдалы бағдарламалық мүмкіндігі – кішірек дерек элементтерін оңай манипуляциялау үшін үлкенірек дерек элементтерімен байланыстыру. Мысалы, 4 байттан және 32 биттік бүтін сандан тұратын дерек құрылымы, белгісіз 64 биттік бүтін санмен одақ құрып, осылайша салыстыру сияқты мақсаттар үшін оңай қолжетімді бола алады.
C/C++
C және C++ тілдерінде белгіленбеген одақтар құрылымдар (структуралар) сияқты дерлік бірдей көрінеді, ерекшелігі – әрбір дерек мүшесі жадта бірдей орыннан басталады. Құрылымдардағыдай, дерек мүшелері бастапқы мәндер болуы міндетті емес, тіпті құрылымдар немесе басқа одақтар да болуы мүмкін. C++ (C++11 нұсқасынан бастап) дерек мүшелеріне толыққанды конструктор/деструктор және/немесе көшіру конструкторы бар кез келген типті немесе тривиалды емес көшіру тапсыру операторын қоюға рұқсат береді. Мысалы, стандартты C++ жолын одақтың мүшесі ретінде пайдалануға болады. Одақтың басты мақсаты – әртүрлі дерек түрлеріне ортақ жад орнына қол жеткізуді қамтамасыз ету, мысалы, аппараттық кіріс/шығысқа қол жеткізу, биттік өрістер мен сөздерді бөлісу немесе типті өзгерту. Одақтар төмен деңгейдегі полиморфизмді де ұсынуы мүмкін. Дегенмен, типтерді тексеру қарастырылмаған, сондықтан бағдарламашы әртүрлі контексттерде дұрыс өрістерге қол жеткізілгеніне көз жеткізуі керек. Одақ айнымалысының тиісті өрісі әдетте басқа айнымалылардың күйімен анықталады, мүмкін, оны қоршап тұрған құрылымда. C бағдарламалаудың кең таралған тәсілі одақтарды пайдаланып C++-та қайта интерпретациялау деп аталатын амалды орындайды, одақтың бір өрісіне мән тағайындап, екіншісінен оқып, мәндердің тікелей бейнелеуіне байланысты кодта қолданылатындай. Практикалық мысал – IEEE форматын пайдаланып түбірдік шаманы есептеу әдісі. Алайда, бұл одақтың жалпы жағдайда қауіпсіз қолданылуы емес. Құрылым және одақ спецификаторлары бірдей форматта болады. [ . ] Одақтың көлемі оның ең үлкен мүшесін сыйыруға жеткілікті. Кез келген уақытта одақ нысанында тек бір мүшенің мәні сақталуы мүмкін. Одақ нысанына сілтеме, тиісінше түрлендірілгенде, оның әрбір мүшесіне (немесе мүше біт өрісі болса, онда ол орналасқан бірлікке) және керісінше нұсқау береді. |ANSI/ISO 9899:1990 (ANSI C стандарты) 6.5.2.1 бөлімі
Ашық одақ
GCC, Clang және AIX үшін IBM XL C сияқты компиляторларда одақ түрлері үшін атрибут қолжетімді. Барлық типтердің өлшемі бірдей болса, одақтағы типтерді функция шақыру кезінде одақ түріне тікелей түрлендіруге болады. Бұл әсіресе көп параметрлі интерфейстері бар функциялар үшін пайдалы, және Unix жүйесінің бастапқы кеңейтімдері мен кейінірек стандарттау қажеттілігінен туындаған.