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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.84
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
#1

Union - C++

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

Возник вопрос про объединения. В книгах я встречал лишь случай, когда размер одного из полей больше или равен сумме размеров остальных. Например:
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2012, 20:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Union (C++):

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

Union - C++
Здравствуйте! Я уже задавал тут вопрос, как использовать union, и сейчас столкнулся с проблемой: Есть 3 файла и заголовочный файл -...

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

Union, struct - C++
Здравствуйте! Помогите, пожалуйста, решить проблему. Есть строки: 1 2 3 4 1 2 3 ... ... * - заканчивается звездочкой

обьединения union - C++
вот собственно код struct х{ union { struct a { string name_c; ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
24.02.2012, 21:14  [ТС] #3
Мне интересно, как будет выделена память во втором случае.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.02.2012, 21:26 #4
размер юниона всегда равен размеру наибольшего типа, который содержит юнион
0
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
24.02.2012, 21:31  [ТС] #5
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.02.2012, 21:35 #6
Цитата Сообщение от Shandr_71 Посмотреть сообщение
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
ещё раз повторяю - в юнионах одни данные, а мемберы юниона лишь позволяют интепретировать эти данные поразному, открой книжку и ещё раз прочитай что такое юнион, и посмотри что выведет sizeof этого юниона!
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.02.2012, 21:51 #7
Shandr_71, не путайте union и struct, это совершенно разные вещи.
0
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
24.02.2012, 22:00  [ТС] #8
Я ничего не путаю.
Тогда так поставлю вопрос:
|---- a ----|
|---- b ----|
|--c----d--|
|--8 байт--|

Память будет распределяться таким образом?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
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
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.02.2012, 22:36 #10
Цитата Сообщение от Shandr_71 Посмотреть сообщение
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
Цитата Сообщение от silent_1991 Посмотреть сообщение
и struct,
Есть вероятность, что размер структуры не будет равен сумме размеров всех ее полей.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.02.2012, 14:08 #11
Цитата Сообщение от go Посмотреть сообщение
Есть вероятность, что размер структуры не будет равен сумме размеров всех ее полей.
И что? В моём сообщении и намёка на размер не было. Суть не в том, чтобы разобраться в выравнивании, а в том, что разница структуры и объединения в том, что структура одновременно может хранить несколько значений разных типов (т.е. её размер будет как минимум равен сумме размеров входящих в него полей), а объединение - только одно значение одного из типов её полей (т.е. размер будет равен максимальному из размеров входящих в неё полей).
0
Denno
52 / 52 / 7
Регистрация: 21.10.2012
Сообщений: 196
Завершенные тесты: 3
22.06.2013, 08:25 #12
Цитата Сообщение от go Посмотреть сообщение
Есть вероятность, что размер структуры не будет равен сумме размеров всех ее полей.
А в каком случае размер структуры не будет равен сумме размеров всех ее полей, можно пример ?
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.06.2013, 08:33 #13
C++
1
2
3
4
struct x {
    char a;
    int b;
};
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
23.06.2013, 14:02 #14
@Denno, почитайте про выравнивание, оттуда ноги растут.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 14:02
Привет! Вот еще темы с ответами:

union с методами - C++
Такой вопрос - когда в union-е поля, то все ясно - оно занимает место, равное наибольшему размеру типов его полей, а когда в нем есть ещё и...

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

Объединения (union) - C++
Имеется задача: (Нужно выполнить решения, используя объединения.) Ввести с клавиатуры два произвольных символа. Составить число типа...

Тип объединения union - C++
Цель: Создайте объект на основе типа объединения union. Докажите, что члены объекта располагаются по одному адресу, а функции-члены - по...


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

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

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