Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 11.08.2015
Сообщений: 121
1

Количество памяти на union и struct

04.12.2016, 23:01. Показов 7848. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct MyStruct{
    int i;
    char j;
};
union Packed{
    int i;
    char j;
};
int _tmain(int argc, _TCHAR* argv[])
{
    //union
    Packed x;
    MyStruct s;
    cout<<"sizeof(Packed)="<<sizeof(Packed)<<endl;
    cout<<"sizeof(MyStruct)="<<sizeof(MyStruct)<<endl;
    
    return 0;
}
По сути они одинаковы только одно занимает 4 байта другое 8 байт. Может кто объяснить почему так. Возможно из-за особенности реализации или что-то другое (может потому, что структура отдаленно напоминает класс...).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2016, 23:01
Ответы с готовыми решениями:

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

Union внутри struct
Добрый вечер! Мне нужно создать структуру с вариантной частью. Не получается получить доступ к...

Обращение к переменным в union со struct
Код такой: union tune_t { struct named { // Общие константы var...

Illegal use of incomplete struct/union/class
Почему выходит эта ошибка? LbsPositionListener.h /* *...

6
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
04.12.2016, 23:11 2
MyStruct: int занимает 4 байта, char один байт, в итоге получаем 5 байт +
3 байта на выравнивание. Выравнивание нужно например для того,
чтобы в массиве MyStruct все поля 'i' (которые int) были выравнены
по границе sizeof (int), т.е. 4 байта. Выравнивание полезно в целях
производительности, а также для определенных гарантий атомарности доступа
(на некоторых платформах доступ к невыравненным данным вообще либо
очень медленный, либо генерирует исключение).

Packet: int и char занимают одну и ту же память. Т.е. размер Packet
определяется по наибольшему типу, т.е. 4 байта.

Надеюсь, расписал понятно и простым языком.
1
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
04.12.2016, 23:12 3
В union поля налагаются в памяти, а в struct идут последовательно. 5 байт выравнивается на четырёхбайтную границу.
1
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
04.12.2016, 23:14 4
Цитата Сообщение от Smeh_ Посмотреть сообщение
По сути они одинаковы только одно занимает 4 байта другое 8 байт.
Это как это? По сути - это совершенно разные вещи. Ничего "одинакового" там и близко нет.

struct хранит все поля одновременно, одно за другим, по порядку. Размер struct равен суммарному размеру его полей плюс "пустые" байты для выравнивания.

union хранит свои поля одно поверх другого, т.е. храниться в union в каждый момент времени может только одино-единственное поле из списка. Размер union равен макисмальному размеру его полей.
0
0 / 0 / 0
Регистрация: 11.08.2015
Сообщений: 121
04.12.2016, 23:25  [ТС] 5
А как правильно понять, что в union " налагаются в памяти", ну если в struct примерно представляю как могут последовательно и выравниваться, то там не понятно.
И еще вопрос в чем ограничение реализации union, почему например struct не сделали таким же в целях экономии.
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
05.12.2016, 00:14 6
Цитата Сообщение от Smeh_ Посмотреть сообщение
И еще вопрос в чем ограничение реализации union, почему например struct не сделали таким же в целях экономии.
В целях какой "экономии"?

Каждый раз, когда вы записывате в поле union какие-то данные, вы тем самым уничтожаете данные всех остальных полей. Вас такое устравиает? Когда устравиает - пользуйтесь union.

Но в большинстве случаев нам такого не надо. В большинстве случаев нам надо, чтобы все поля хранились одновременно и независимо и никто никого не уничтожал. А это - struct.
1
0 / 0 / 0
Регистрация: 11.08.2015
Сообщений: 121
05.12.2016, 00:18  [ТС] 7
А все понял, просто в примере в книжке там поочередно присваивалось значение, потом выводилось, и то ,что другие затираются не видно.
0
05.12.2016, 00:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2016, 00:18
Помогаю со студенческими работами здесь

В чем отличия между union и struct?
Здравствуйте! Вопрос в названии темы

два и более struct в union неправильно работает
#include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;string.h&gt; using namespace std; struct...

std::bind1st: is not a class, struct, or union type
Добрый день, пытаюсь найти элемент в списки указателей на объекты классачерез предикат. Вот...

Задача про знак зодиака (Struct, string, union, if)
Здравствуйте! Вся проблема начинается на 31 строчке выделеной */*, нужно как то разделить запись...

Не могу исправить error C2228: left of '.isWorked' must have class/struct/union
Добрый день. Есть два взаимодружественных класса.Методом одного, меняю поля другого. Вот код: ...

error C2228: left of '.add' must have class/struct/union type. в чем ошибка?
Помогите понять в чем ошибка. Пасиб. #include &lt;iostream.h&gt; class book { private: char...


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

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