Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 145, средняя оценка - 4.79
VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
#1

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

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

Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 11:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Union что из себя представляет? (C++):

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

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

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

Что такое stract pragma и union - C++
Учусь писать программки для микроконтроллеров, и в большинстве примеров используют эти штучки, пробовал гуглить, но до конца их сути так и...

Union с явными указателями или void*- что выбрать? - C++
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о....

Что из себя представляют типы данных? - C++
Всем привет! Изучаю С++ по книге Шилда Г.С... Прошел тему по Типам данных в С++ и двигаюись дальше... Все что сразу не ясно, со временем...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
iama
1250 / 975 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
27.08.2010, 11:45 #2
Объединение (англ. union) в программировании — структура данных, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. В любой момент времени объединение хранит значение только одного из членов.
непонятно-то что?
2
VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
27.08.2010, 11:46  [ТС] #3
И смысл?
0
Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
27.08.2010, 11:48 #4
Вот что по этому поводу думает справочник по 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 .
2
VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
27.08.2010, 11:53  [ТС] #5
Ясно теперь, а для чего его можно использовать?
0
Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
27.08.2010, 11:58 #6
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
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.08.2010, 12:09 #7
Цитата Сообщение от Mencey Посмотреть сообщение
sizeof( struct B ) будет равен sizeof( int ) + sizeof( float ) + sizeof( double ).
Не совсем так. Надо учитывать выравнивание.
0
Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
27.08.2010, 12:18 #8
Цитата Сообщение от fasked Посмотреть сообщение
Не совсем так. Надо учитывать выравнивание.
Но всеравно sizeof( A ) < sizeof( B )!
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
27.08.2010, 12:29 #9
если у вас из десяти структур одновременно используется только одна, то имеет смысл объеденить их в union, можно даже в безымянный, хотя в с++ его реже используют
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
27.08.2010, 13:03 #10
Всё-таки, по-моему, юнион со структурами сравнивать не очень корректно, ибо обычно структуры создаются так, чтобы использовались все их элементы. Вообще сколько кода видел, никто не использовал юнионы. Так что зачастую они не нужны.
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,709
27.08.2010, 17:21 #11
Цитата Сообщение от 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
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
27.08.2010, 18:33 #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
Так что зачастую они не нужны.
Вы неправы их хоть и редко используют, но вещь нужная!
0
daniilorain
👻👻👻
18 / 25 / 11
Регистрация: 22.04.2016
Сообщений: 166
18.06.2016, 19:01 #13
Прошу прощения за некропостинг, мало ли найдутся такие люди, как и я, ищущие ответ, где может пригодится 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
AmirAfendin
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 3
20.06.2016, 15:31 #14
я как раз сейчас через гугл попал на эту тему и твой пост вроде бы вовремя но этот код просто агония, это вобще C++? Что за "unsigned a : 1;" для начала? впервые вижу
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,061
Завершенные тесты: 1
20.06.2016, 15:37 #15
Цитата Сообщение от AmirAfendin Посмотреть сообщение
unsigned a : 1
это битовое поле - первый бит из восьми в структуре byte
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2016, 15:37
Привет! Вот еще темы с ответами:

STL Вектор Копирование элемнтов себя из себя - C++
Смысл такой, вектор содержит несколько чисел 1,2,3,4,5,6,7 Я хочу на алгоритмах скопировать некоторый блок элементов. например ...

Правильно ли я делаю, что начинаю становления себя как программиста с решения мелких задач из интернета? - C++
Здравствуйте форумчане! Хочу задать вопрос, и узнать ваше мнение. Я начинающий программист на С++. Изучаю теорию по книге Стивена Прата...

Union - C++
Человеки привет =) Скажите пожалуйста для чего используются union в С++?

Union - C++
Возник вопрос про объединения. В книгах я встречал лишь случай, когда размер одного из полей больше или равен сумме размеров остальных....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2016, 15:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru