13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
|
|||||||||||
1 | |||||||||||
Union24.02.2012, 20:54. Показов 9345. Ответов 13
Метки нет (Все метки)
Возник вопрос про объединения. В книгах я встречал лишь случай, когда размер одного из полей больше или равен сумме размеров остальных. Например:
0
|
24.02.2012, 20:54 | |
Ответы с готовыми решениями:
13
Union Union и UB union Union |
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
|
|
24.02.2012, 21:14 [ТС] | 3 |
Мне интересно, как будет выделена память во втором случае.
0
|
13 / 13 / 6
Регистрация: 05.12.2011
Сообщений: 84
|
|
24.02.2012, 21:31 [ТС] | 5 |
В моем примере тип double - самый большой (8 байт), но для хранения всех членов нужно минимум 16 байт.
0
|
Каратель
|
|
24.02.2012, 21:35 | 6 |
ещё раз повторяю - в юнионах одни данные, а мемберы юниона лишь позволяют интепретировать эти данные поразному, открой книжку и ещё раз прочитай что такое юнион, и посмотри что выведет 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. Вот пример:
Код
1 49 2.42092e-322 8
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
25.02.2012, 14:08 | 11 |
И что? В моём сообщении и намёка на размер не было. Суть не в том, чтобы разобраться в выравнивании, а в том, что разница структуры и объединения в том, что структура одновременно может хранить несколько значений разных типов (т.е. её размер будет как минимум равен сумме размеров входящих в него полей), а объединение - только одно значение одного из типов её полей (т.е. размер будет равен максимальному из размеров входящих в неё полей).
0
|
98 / 101 / 30
Регистрация: 21.10.2012
Сообщений: 320
|
|
22.06.2013, 08:25 | 12 |
А в каком случае размер структуры не будет равен сумме размеров всех ее полей, можно пример ?
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
22.06.2013, 08:33 | 13 | |||||
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
23.06.2013, 14:02 | 14 |
@Denno, почитайте про выравнивание, оттуда ноги растут.
0
|
23.06.2013, 14:02 | |
23.06.2013, 14:02 | |
Помогаю со студенческими работами здесь
14
Union-объеденения constexpr и union Управляемый value union Union - Объединения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |