7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
|
|
1 | |
Union что из себя представляет?27.08.2010, 11:33. Показов 33475. Ответов 52
Метки нет (Все метки)
Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
0
|
27.08.2010, 11:33 | |
Ответы с готовыми решениями:
52
Что из себя представляет std::wstring? Что из себя представляет допустим поток ввода/вывода Что из себя представляет код в стеке, и как его использовать Что из себя представляет CMS |
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
|
|
27.08.2010, 11:45 | 2 |
2
|
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
|
|
27.08.2010, 11:46 [ТС] | 3 |
И смысл?
0
|
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
|
|
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 .
3
|
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
|
|
27.08.2010, 11:53 [ТС] | 5 |
Ясно теперь, а для чего его можно использовать?
0
|
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
|
||||||
27.08.2010, 11:58 | 6 | |||||
VintProg, для экономия памяти.
Например:
sizeof( struct B ) будет равен sizeof( int ) + sizeof( float ) + sizeof( double ).
3
|
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
|
|
27.08.2010, 12:18 | 8 |
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
27.08.2010, 12:29 | 9 |
если у вас из десяти структур одновременно используется только одна, то имеет смысл объеденить их в union, можно даже в безымянный, хотя в с++ его реже используют
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
27.08.2010, 13:03 | 10 |
Всё-таки, по-моему, юнион со структурами сравнивать не очень корректно, ибо обычно структуры создаются так, чтобы использовались все их элементы. Вообще сколько кода видел, никто не использовал юнионы. Так что зачастую они не нужны.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
||||||
27.08.2010, 17:21 | 11 | |||||
Ну применение-то всему можно найти... Вот к примеру програмка, определяющая порядок байт в системе (первый младший / первый старший):
0
|
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
|
|
27.08.2010, 18:33 | 12 |
0
|
👻👻👻
21 / 28 / 12
Регистрация: 22.04.2016
Сообщений: 166
|
||||||
18.06.2016, 19:01 | 13 | |||||
Прошу прощения за некропостинг, мало ли найдутся такие люди, как и я, ищущие ответ, где может пригодится union.
Эта программа выводит ASCII-код введённой буквы (из книги Шилдта):
0
|
0 / 0 / 0
Регистрация: 26.11.2015
Сообщений: 3
|
|
20.06.2016, 15:31 | 14 |
я как раз сейчас через гугл попал на эту тему и твой пост вроде бы вовремя но этот код просто агония, это вобще C++? Что за "unsigned a : 1;" для начала? впервые вижу
0
|
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|
20.06.2016, 15:37 | 15 |
0
|
👻👻👻
21 / 28 / 12
Регистрация: 22.04.2016
Сообщений: 166
|
|
21.06.2016, 19:11 | 16 |
Нажимайте на кнопку с синей галочкой вниз, я ведь ваше сообщение случайно увидел
Это битовое поле. Здесь переменные a,b,c...h занимают каждые по 1 биту. Они нужны здесь для того, чтобы вывести код введённой буквы. Символ занимает 1 байт, то есть 8 бит (в некоторых системах 1 байт = 9 бит, но это оффтоп), в union как раз используются 8 символов, которые занимаются по 1 биту, то есть 1 * 8 = 8 бит они занимают в общем, что соответствует одному символу, который будет введён и записан в union. Символы представляются для компьютера в виде последовательности 0,1 (как и всё остальное), так вот в этот union для компьютера записались нули и единицы. И так как введённый символ ch и структура с битовыми полями занимаются одну область памяти, то нули и единицы можно считать. 01100001 -- двоичное представление символа 'a'
0
|
21.06.2016, 19:51 | 17 |
С точки зрения стандарта такое поведение незаконное, т.к. нельзя писать в одно поле union'а, а читать из другого. Хотя постфактум такой код будет работать везде (а может быть почти везде)
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
21.06.2016, 21:02 | 18 |
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
21.06.2016, 21:46 | 19 |
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?) И оговорка о том, что стандарт говорит, что подобное действие - UB, здесь вполне уместна.
0
|
21.06.2016, 21:54 | 20 |
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules". В стандарте конкретно таких слов нету, но есть некий смысл, из которого следует, что указатели на разные типы данных, исключая указатель на char*, должны смотреть на разную память. И косвенно (или даже прямо) оттуда вытекают ограничения в работе с union'ами. С ходу я в стандарте это место не смог найти. После отпуска поищу на работе, у меня где-то это было выписано
0
|
21.06.2016, 21:54 | |
21.06.2016, 21:54 | |
Помогаю со студенческими работами здесь
20
Что из себя представляет WordPress? Что представляет из себя WikiLeaks? Что из себя представляет ковариация? что из себя представляет криптография ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |