Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/180: Рейтинг темы: голосов - 180, средняя оценка - 4.64
 Аватар для VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44

Union что из себя представляет?

27.08.2010, 11:33. Показов 36142. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.08.2010, 11:33
Ответы с готовыми решениями:

Что из себя представляет std::wstring?
В общем насколько я понимаю это string с типом wchar_t. Но есть вопросы: 1. Размер типа wchar_t зависит от компилятора и не...

Что из себя представляет допустим поток ввода/вывода
Поясните пожалуйста что из себя представляет допустим поток ввода/вывода в С++ ? Это участок памяти который представляет собой что-то вроде...

Что из себя представляет код в стеке, и как его использовать
Гугл мне по этому поводу не помог, поэтому спрашиваю тут: что из себя представляет из себя код в стеке, как его использовать(вызвать там и...

52
 Аватар для iama
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
27.08.2010, 11:45
Объединение (англ. union) в программировании — структура данных, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. В любой момент времени объединение хранит значение только одного из членов.
непонятно-то что?
2
 Аватар для VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
27.08.2010, 11:46  [ТС]
И смысл?
0
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
27.08.2010, 11:48
Вот что по этому поводу думает справочник по C:

Из справочника по C
1.2.8. Объединения (смеси)
Объединение подобно структуре, однако в каждый момент времени может использоваться (или другими словами быть ответным) только один из элементов объединения. Тип объединения может задаваться в следующем виде:

union { описание элемента 1;
...
описание элемента n; };

Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти, т.е. они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат не был бессмысленным.

Доступ к элементам объединения осуществляется тем же способом, что и к структурам. Тег объединения может быть формализован точно так же, как и тег структуры.

Объединение применяется для следующих целей:

- инициализации используемого объекта памяти, если в каждый момент времени только один объект из многих является активным;

- интерпретации основного представления объекта одного типа, как если бы этому объекту был присвоен другой тип.

Память, которая соответствует переменной типа объединения, определяется величиной, необходимой для размещения наиболее длинного элемента объединения. Когда используется элемент меньшей длины, то переменная типа объединения может содержать неиспользуемую память. Все элементы объединения хранятся в одной и той же области памяти, начиная с одного адреса.

Пример:

union { char fio[30];
char adres[80];
int vozrast;
int telefon; } inform;
union { int ax;
char al[2]; } ua;

При использовании объекта infor типа union можно обрабатывать только тот элемент который получил значение, т.е. после присвоения значения элементу inform.fio, не имеет смысла обращаться к другим элементам. Объединение ua позволяет получить отдельный доступ к младшему ua.al[0] и к старшему ua.al[1] байтам двухбайтного числа ua.ax .
3
 Аватар для VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
27.08.2010, 11:53  [ТС]
Ясно теперь, а для чего его можно использовать?
0
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
27.08.2010, 11:58
VintProg, для экономия памяти.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Объединение
union A {
  int a;
  float b;
  double c;
};
 
// Структура
struct B {
  int a;
  float b;
  double c;
};
sizeof( union A ) бадет равен sizeof( double ), а
sizeof( struct B ) будет равен sizeof( int ) + sizeof( float ) + sizeof( double ).
3
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
27.08.2010, 12:09
Цитата Сообщение от Mencey Посмотреть сообщение
sizeof( struct B ) будет равен sizeof( int ) + sizeof( float ) + sizeof( double ).
Не совсем так. Надо учитывать выравнивание.
0
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
27.08.2010, 12:18
Цитата Сообщение от fasked Посмотреть сообщение
Не совсем так. Надо учитывать выравнивание.
Но всеравно sizeof( A ) < sizeof( B )!
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.08.2010, 12:29
если у вас из десяти структур одновременно используется только одна, то имеет смысл объеденить их в union, можно даже в безымянный, хотя в с++ его реже используют
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
27.08.2010, 13:03
Всё-таки, по-моему, юнион со структурами сравнивать не очень корректно, ибо обычно структуры создаются так, чтобы использовались все их элементы. Вообще сколько кода видел, никто не использовал юнионы. Так что зачастую они не нужны.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.08.2010, 17:21
Цитата Сообщение от VintProg Посмотреть сообщение
Ясно теперь, а для чего его можно использовать?
Ну применение-то всему можно найти... Вот к примеру програмка, определяющая порядок байт в системе (первый младший / первый старший):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
union {
    unsigned short sh;
    unsigned char bt[sizeof(short)];
} un;
 
int main(void){
    if ( sizeof(short) != 2 ){
        printf("Too long size for short type.\n");
        return 1;
    }
    un.sh = 0x0102;
    printf("%s endian\n", ( un.bt[0] == 1 ) ? "Big" : "Little");
 
    return 0;
}
0
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
27.08.2010, 18:33
Цитата Сообщение от silent_1991 Посмотреть сообщение
Так что зачастую они не нужны.
Вы неправы их хоть и редко используют, но вещь нужная!
0
👻👻👻
 Аватар для daniilorain
21 / 28 / 12
Регистрация: 22.04.2016
Сообщений: 166
18.06.2016, 19:01
Прошу прощения за некропостинг, мало ли найдутся такие люди, как и я, ищущие ответ, где может пригодится union.
Эта программа выводит ASCII-код введённой буквы (из книги Шилдта):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <ctime>
 
using namespace std;
 
struct byte {
    unsigned a : 1;
    unsigned b : 1;
    unsigned c : 1;
    unsigned d : 1;
    unsigned e : 1;
    unsigned f : 1;
    unsigned g : 1;
    unsigned h : 1;
};
 
union bits {
    char ch;
    struct byte bit;
} ascii;
 
void disp_bits(bits b);
 
int main() {
    setlocale(0, "");
 
    do {
        cin >> ascii.ch;
        cout << ":";
        disp_bits(ascii);
    } while (ascii.ch != 'q');
 
    cin.get();
    return 0;
}
 
void disp_bits(bits b) {
    if (b.bit.h) cout << "1";
    else cout << "0";
    if (b.bit.g) cout << "1";
    else cout << "0";
    if (b.bit.f) cout << "1";
    else cout << "0";
    if (b.bit.e) cout << "1";
    else cout << "0";
    if (b.bit.d) cout << "1";
    else cout << "0";
    if (b.bit.c) cout << "1";
    else cout << "0";
    if (b.bit.b) cout << "1";
    else cout << "0";
    if (b.bit.a) cout << "1";
    else cout << "0";
    cout << "\n";
}
0
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 3
20.06.2016, 15:31
я как раз сейчас через гугл попал на эту тему и твой пост вроде бы вовремя но этот код просто агония, это вобще C++? Что за "unsigned a : 1;" для начала? впервые вижу
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
20.06.2016, 15:37
Цитата Сообщение от AmirAfendin Посмотреть сообщение
unsigned a : 1
это битовое поле - первый бит из восьми в структуре byte
0
👻👻👻
 Аватар для daniilorain
21 / 28 / 12
Регистрация: 22.04.2016
Сообщений: 166
21.06.2016, 19:11
Нажимайте на кнопку с синей галочкой вниз, я ведь ваше сообщение случайно увидел
Это битовое поле. Здесь переменные a,b,c...h занимают каждые по 1 биту.
Они нужны здесь для того, чтобы вывести код введённой буквы. Символ занимает 1 байт, то есть 8 бит (в некоторых системах 1 байт = 9 бит, но это оффтоп), в union как раз используются 8 символов, которые занимаются по 1 биту, то есть 1 * 8 = 8 бит они занимают в общем, что соответствует одному символу, который будет введён и записан в union. Символы представляются для компьютера в виде последовательности 0,1 (как и всё остальное), так вот в этот union для компьютера записались нули и единицы. И так как введённый символ ch и структура с битовыми полями занимаются одну область памяти, то нули и единицы можно считать.
01100001 -- двоичное представление символа 'a'
Миниатюры
Union что из себя представляет?  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.06.2016, 19:51
Цитата Сообщение от easybudda Посмотреть сообщение
Вот к примеру програмка, определяющая порядок байт в системе
С точки зрения стандарта такое поведение незаконное, т.к. нельзя писать в одно поле union'а, а читать из другого. Хотя постфактум такой код будет работать везде (а может быть почти везде)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
21.06.2016, 21:02
Цитата Сообщение от Evg Посмотреть сообщение
Хотя постфактум такой код будет работать везде (а может быть почти везде)
Это пример из книжки "UNIX разработка сетевых приложений".
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
21.06.2016, 21:46
Цитата Сообщение от easybudda Посмотреть сообщение
Это пример из книжки "UNIX разработка сетевых приложений".
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?) И оговорка о том, что стандарт говорит, что подобное действие - UB, здесь вполне уместна.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.06.2016, 21:54
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules". В стандарте конкретно таких слов нету, но есть некий смысл, из которого следует, что указатели на разные типы данных, исключая указатель на char*, должны смотреть на разную память. И косвенно (или даже прямо) оттуда вытекают ограничения в работе с union'ами. С ходу я в стандарте это место не смог найти. После отпуска поищу на работе, у меня где-то это было выписано
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.06.2016, 21:54
Помогаю со студенческими работами здесь

Что из себя представляет CMS
Доброго времени суток! Учу Web только полтора месяца, заметил что очень часто фигирирует аббревиатура CMS. Пытался...

Что из себя представляет WordPress?
WordPress - это программа (отдельный процесс на сервере), или это просто сборка скриптов, которая работает под управлением интерпретатора...

Что представляет из себя WikiLeaks?
Портал существует с декабря 2006 года и уже успел вызвать большой резонанс. Авторы сайта (Джулиан Ассанж и команда) заявляют свое...

Что из себя представляет ковариация?
Объясните пожалуйста наглядно, что из себя представляем ковариация и коэффициент корреляции. Добавляю картинку, на которой сделал...

что из себя представляет криптография ?
я понимаю, что шифрует файлы, обеспечивая защиту(поправьте меня если что), но собственно в примерах и подробностях &quot;Где? Для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru