Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/50: Рейтинг темы: голосов - 50, средняя оценка - 4.54
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
1

Union

24.02.2012, 20:54. Показов 9345. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возник вопрос про объединения. В книгах я встречал лишь случай, когда размер одного из полей больше или равен сумме размеров остальных. Например:
C++
1
2
3
4
5
union
{
    double a;
    char b[2];
};
А как будет работать объединение в таком случае:
C++
1
2
3
4
5
6
7
union
{
    double a;
    double b;
    int c;
    int d;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2012, 20:54
Ответы с готовыми решениями:

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

Union и UB
Можно ли каким-либо образом использовать union как основу для легковесного variant? Насколько я...

union
Реализовать структуру «Машина» (цвет, модель, номер). Номер машины может представлять из себя или...

Union
Здравствуйте! Я уже задавал тут вопрос, как использовать union, и сейчас столкнулся с проблемой:...

13
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
24.02.2012, 20:58 2
Цитата Сообщение от Shandr_71 Посмотреть сообщение
В книгах я встречал лишь случай, когда размер одного из полей больше или равен сумме размеров остальных.
лол что?

Цитата Сообщение от Shandr_71 Посмотреть сообщение
А как будет работать объединение в таком случае:
C++
1
2
3
4
5
6
7
union
{
* * double a;
* * double b;
* * int c;
* * int d;
};
union на то и union чтоб хранить одни данные разных типов
0
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
24.02.2012, 21:14  [ТС] 3
Мне интересно, как будет выделена память во втором случае.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
24.02.2012, 21:26 4
размер юниона всегда равен размеру наибольшего типа, который содержит юнион
0
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
24.02.2012, 21:31  [ТС] 5
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
24.02.2012, 21:35 6
Цитата Сообщение от Shandr_71 Посмотреть сообщение
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
ещё раз повторяю - в юнионах одни данные, а мемберы юниона лишь позволяют интепретировать эти данные поразному, открой книжку и ещё раз прочитай что такое юнион, и посмотри что выведет sizeof этого юниона!
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.02.2012, 21:51 7
Shandr_71, не путайте union и struct, это совершенно разные вещи.
0
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
24.02.2012, 22:00  [ТС] 8
Я ничего не путаю.
Тогда так поставлю вопрос:
|---- a ----|
|---- b ----|
|--c----d--|
|--8 байт--|

Память будет распределяться таким образом?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.02.2012, 22:29 9
Shandr_71, память никак не будет распределяться. Будет выделено ровно столько памяти, чтобы вместить максимальный тип. Любая переменная - просто некоторый набор битов. Если тип double имеет размер 8 байт (64 бита), а int - 4 байта (32 бита), то, разумеется, можно использовать младшие 32 бита переменной типа double под переменную типа int. Вот union и позволяет интерпретировать некоторый набор битов по-разному, в зависимости от наименования поля union. Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
union Foo
{
    char a;
    int b;
    double c;
};
 
int main()
{
    Foo bar;
    
    bar.a = 49;
    
    std::cout << bar.a << std::endl;
    std::cout << bar.b << std::endl;
    std::cout << bar.c << std::endl;
    std::cout << sizeof(bar) << std::endl;
    
    return 0;
}
У меня программа выводит:
Код
1
49
2.42092e-322
8
И a, и b, и c на самом деле расположены в одной и той же памяти размером 8 байт (размер типа double). Видно, что когда мы выводим char, значение 49 интерпретируется как символ и выводится символ '1' (с кодом 49). Когда мы выводим int, значение интерпретируется как целое и выводится 49, как и ожидалось. При выводе double на первый взгляд кажется, что там мусор, но нет, просто тип double хранится в особом формате, и тот набор битов, который сейчас записан в памяти, ассоциированной с переменной bar, интерпретируется именно как число 2.42092e-322.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
24.02.2012, 22:36 10
Цитата Сообщение от Shandr_71 Посмотреть сообщение
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
Цитата Сообщение от silent_1991 Посмотреть сообщение
и struct,
Есть вероятность, что размер структуры не будет равен сумме размеров всех ее полей.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.02.2012, 14:08 11
Цитата Сообщение от go Посмотреть сообщение
Есть вероятность, что размер структуры не будет равен сумме размеров всех ее полей.
И что? В моём сообщении и намёка на размер не было. Суть не в том, чтобы разобраться в выравнивании, а в том, что разница структуры и объединения в том, что структура одновременно может хранить несколько значений разных типов (т.е. её размер будет как минимум равен сумме размеров входящих в него полей), а объединение - только одно значение одного из типов её полей (т.е. размер будет равен максимальному из размеров входящих в неё полей).
0
98 / 101 / 30
Регистрация: 21.10.2012
Сообщений: 320
22.06.2013, 08:25 12
Цитата Сообщение от go Посмотреть сообщение
Есть вероятность, что размер структуры не будет равен сумме размеров всех ее полей.
А в каком случае размер структуры не будет равен сумме размеров всех ее полей, можно пример ?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
22.06.2013, 08:33 13
C++
1
2
3
4
struct x {
    char a;
    int b;
};
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
23.06.2013, 14:02 14
@Denno, почитайте про выравнивание, оттуда ноги растут.
0
23.06.2013, 14:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2013, 14:02
Помогаю со студенческими работами здесь

Union-объеденения
Добрый день. Почему при выводе cout &lt;&lt; &quot;u2 как целое: &quot;; //выводит число 22872? cout &lt;&lt;...

constexpr и union
Добрый день! Подскажите пожалуйста, можно ли использовать constexpr для расчета на этапе компиляции...

Управляемый value union
Добрый вечер. Пытаюсь создать такую структуру: using namespace std; union actiondata{ char...

Union - Объединения
Объясните доходчиво что такое Объединения и для какой работы они нужны. Несколько книг листал а...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru