Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Переменная, способная хранить данные разных типов
Variable able to hold different data types
В информатике объединение (union) – это значение, которое может иметь одно из нескольких представлений или форматов в одном и том же месте в памяти; оно состоит из переменной, способной содержать такую структуру данных. Некоторые языки программирования поддерживают специальные типы данных, называемые типами объединений, для описания таких значений и переменных. Иными словами, определение типа объединения указывает, какой из числа допустимых примитивных типов может быть сохранен в его экземплярах, например, "вещественное число или длинное целое". В отличие от записи (или структуры), которая может быть определена для хранения как вещественного, так и целого числа, в объединении в любой момент времени может храниться только одно значение. Объединение можно представить как участок памяти, используемый для хранения переменных различных типов данных. При присвоении новому полю значения, существующие данные перезаписываются. Область памяти, хранящая значение, не имеет встроенного типа (кроме байтов или слов памяти), но значение может интерпретироваться как один из нескольких абстрактных типов данных, принимая тип значения, которое было записано в эту область памяти последним. В теории типов объединение соответствует суммарному типу; это соответствует дизъюнктному объединению в математике. В зависимости от языка и типа, значение объединения может использоваться в некоторых операциях, таких как присваивание и сравнение на равенство, без знания его конкретного типа. Другие операции могут требовать этой информации, либо посредством внешних данных, либо с использованием помеченного объединения.
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-битовым беззнаковым целым числом, что облегчает доступ к ней для сравнения и других целей.
Because of the limitations of their use, untagged unions are generally only provided in untyped languages or in a type unsafe way (as in C). They have the advantage over simple tagged unions of not requiring space to store a data type tag. The name "union" stems from the type's formal definition. If a type is considered as the set of all values that that type can take on, a union type is simply the mathematical union of its constituting types, since it can take on any value any of its fields can. Also, because a mathematical union discards duplicates, if more than one field of the union can take on a single common value, it is impossible to tell from the value alone which field was last written. However, one useful programming function of unions is to map smaller data elements to larger ones for easier manipulation. A data structure consisting, for example, of 4 bytes and a 32 bit integer, can form a union with an unsigned 64 bit integer, and thus be more readily accessed for purposes of comparison etc.
C/C++
В C и C++ немаркированные объединения выражаются почти так же, как структуры (структы), за исключением того, что каждый член данных начинается в одном и том же месте в памяти. Члены данных, как и в структурах, не обязаны быть примитивными значениями и могут быть структурами или даже другими объединениями. C++ (начиная с C++11) также допускает, чтобы членом данных был любой тип, имеющий полноценный конструктор/деструктор и/или конструктор копирования, или нетривиальный оператор присваивания копированием. Например, можно использовать стандартную строку C++ в качестве члена объединения. Основное назначение объединения – обеспечение доступа к общему участку памяти с использованием различных типов данных, например, для доступа к аппаратному вводу/выводу, обмена битовыми полями и словами или для приведения типов. Объединения также могут обеспечивать низкоуровневый полиморфизм. Однако проверка типов не выполняется, поэтому программист должен убедиться, что в разных контекстах осуществляется доступ к нужным полям. Актуальное поле переменной объединения обычно определяется состоянием других переменных, возможно, в enclosing структуре. Распространенный прием в программировании на C использует объединения для выполнения того, что в C++ называется reinterpret_cast, путем присваивания значения одному полю объединения и чтения из другого, как это делается в коде, зависящем от непосредственного представления значений. Практическим примером является метод вычисления квадратных корней с использованием представления IEEE. Однако это не всегда безопасное использование объединений. Объявления структур и объединений имеют одинаковый формат. [ . ] Размер объединения достаточен для размещения самого большого из его членов. В любой момент времени в объекте объединения может храниться значение только одного из его членов. Указатель на объект объединения, при соответствующем приведении типов, указывает на каждый из его членов (или, если член является битовым полем, то на единицу, в которой оно находится), и наоборот. |ANSI/ISO 9899:1990 (стандарт ANSI C) Раздел 6.5.2.1
In C and C++, untagged unions are expressed nearly exactly like structures (structs), except that each data member begins at the same location in memory. The data members, as in structures, need not be primitive values, and in fact may be structures or even other unions. C++ (since C++11) also allows for a data member to be any type that has a full fledged constructor/destructor and/or copy constructor, or a non trivial copy assignment operator. For example, it is possible to have the standard C++ string as a member of a union. The primary use of a union is allowing access to a common location by different data types, for example hardware input/output access, bitfield and word sharing, or type punning. Unions can also provide low level polymorphism. However, there is no checking of types, so it is up to the programmer to be sure that the proper fields are accessed in different contexts. The relevant field of a union variable is typically determined by the state of other variables, possibly in an enclosing struct. 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
Прозрачный союз
В компиляторах, таких как GCC, Clang и IBM XL C для AIX, доступен атрибут для типов объединений. Типы, содержащиеся в объединении, могут быть прозрачно преобразованы к типу самого объединения при вызове функции, при условии, что все типы имеют одинаковый размер. Он предназначен главным образом для функций с множественными параметрами, необходимость использования которых возникла из-за ранних расширений Unix и последующей повторной стандартизации.
In compilers such as GCC, Clang, and IBM XL C for AIX, a attribute is available for union types. Types contained in the union can be converted transparently to the union type itself in a function call, provided that all types have the same size. It is mainly intended for function with multiple parameter interfaces, a use necessitated by early Unix extensions and later re standarisation.