Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126

Как представляется моя структура с перечислением в памяти?

22.03.2020, 17:55. Показов 1757. Ответов 15

Студворк — интернет-сервис помощи студентам
Типы, которые тут используются:
C++
1
2
typedef unsigned int UINT;
typedef LPCTSTR const wchar_t *;
C++
1
2
3
4
5
6
7
8
9
10
11
    struct HotKey {
        //ВНИМАНИЕ! Порядок идентификаторов должен совпадать по смыслу с порядком горячих клавиш!
        enum HotKeysList {// перечисление с идентификаторами горячих клавиш
            HotKeyClickStartId, HotKeyOpenMainWindow, HotKeyCloseId, HotKeyRightButtonClickId, HotKeyLeftButtonClickId, HotKeySetIntervalOfClicksId, HotKeyOpenHotKeySettings
        };
        UINT Modifiers = NULL;//модификаторы
        UINT vk = NULL;// код виртуальной клавишы
        bool HotKeyIsRegistred = false;//горячая клавиша зарегистрирована
        bool HotKeyIsEnable = false;//включена ли горячая клавиша
        LPCTSTR RegistryHotKeyName;
    };
Как эта структура представляется в памяти? Я определи что пустая структура занимает 1 байт, нашёл даже вопрос в сети по этому поводу, но занимает ли перечисление память? Ну так как его объявил я... Я выполнил sizeof(HotKeysList) и получил 4 байта, неужели оно хранится в памяти? У меня 64-битная машина, отчего последний указатель на строку занимает 8 байт, тоже проверял, ну и 2 UINT - 8 байт, 2 bool - 2 байта, в итоге 8 + 8 + 2 + 1 = 19, а вся моя структура, если выполнить sizeof(HotKey) занимает 24 байта, ну и 24 - 19 = 5, куда ещё 5 байт? Или я неправильно посчитал? Ну да, я не прибавлял перечисление, если пересчитать, то: 8 + 8 + 2 + 1 + 4 = 23, а вся структура весит 24, значит куда-то делся ещё один байт.
Ну и отдельный вопрос, члены структуры расположены по-порядку в памяти? Если перечисление всё же хранится, то зачем оно там? Если я не определил переменную типа перечисления.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2020, 17:55
Ответы с готовыми решениями:

Как в памяти представляется двусторонняя очередь (deque)?
Люди пожалуйста помогите разобраться, как в памяти представляется двусторонняя очередь (deque), типа нарисовать таблицу ну память и...

Записать число типа int в массив char -ов так, как оно представляется в памяти
Здравствуйте, моя цель - записать переменную какого-либо типа в массив char-ов (строку) так, как она представляется в памяти. Например, я...

Правильна ли моя структура базы данных
Привет создаю базу данных онлайн табло ЖД вокзла вот спроектировал структуру правильна ли она

15
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
22.03.2020, 18:03
Цитата Сообщение от blbulyan Посмотреть сообщение
куда ещё 5 байт?
Расставим точки над структурами C/C++

Цитата Сообщение от blbulyan Посмотреть сообщение
Я определи что пустая структура занимает 1 байт
Структура ничего не занимает. Итого https://www.cyberforum.ru/cgi-bin/latex.cgi?4 + 4 + 1 + 1 + 8 = 18, если pragma pack добавить.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.03.2020, 18:08
Цитата Сообщение от blbulyan Посмотреть сообщение
Ну так как его объявил я...
Нет. Это просто набор именованных констант.
Цитата Сообщение от blbulyan Посмотреть сообщение
Я выполнил sizeof(HotKeysList)
Перечисление - это тоже тип. sizeof дал размер типа.
Если создадите объект перечисления, то он как раз будет занимать столько байт.
Тип можно указать вручную:
C++
1
2
enum HotKeysList: unsigned char {}
static_assert(sizeof(HotKeysList) == 1);
Цитата Сообщение от blbulyan Посмотреть сообщение
в итоге 8 + 8 + 2 + 1 = 19
Откуда +1?
Цитата Сообщение от blbulyan Посмотреть сообщение
куда ещё 5 байт?
6 байт идет на отступы для выравнивания на 8 байт.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.03.2020, 18:10
Цитата Сообщение от blbulyan Посмотреть сообщение
занимает ли перечисление память? Ну так как его объявил я...
Нет.

Цитата Сообщение от blbulyan Посмотреть сообщение
Или я неправильно посчитал?
Да, неправильно.

Цитата Сообщение от blbulyan Посмотреть сообщение
У меня 64-битная машина
Layout такой:
offset | 0 | Modifiers (4)
offset | 4 | vk (4)
offset | 8 | HotKeyIsRegistred (1)
offset | 9 | HotKeyIsEnable (1) + padding (6)
offset | 16 | RegistryHotKeyName (8)

Итого: 4 + 4 + 1 + 1 + 6 + 8 = 24
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.03.2020, 18:17
Цитата Сообщение от DrOffset Посмотреть сообщение
Layout такой:
Вопрос. А может компилятор сделать так:
offset | 8 | HotKeyIsRegistred (1) + padding(3)
offset | 12 | HotKeyIsEnable (1) + padding (3)

???
0
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
22.03.2020, 18:35  [ТС]
Цитата Сообщение от valen10 Посмотреть сообщение
Расставим точки над структурами C/C++


Структура ничего не занимает. Итого https://www.cyberforum.ru/cgi-bin/latex.cgi?4 + 4 + 1 + 1 + 8 = 18, если pragma pack добавить.
Ну тогда почему sizeof от пустой структуры выдаёт 1?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.03.2020, 18:40
blbulyan, вы же, вроде, нашли ответ на этот вопрос.
Если размер пустой структуры был бы ноль, то, например, сколько должен весить массив таких структур? Ноль? А все элементы этого массива лежали бы по одному адресу?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.03.2020, 18:46
Цитата Сообщение от Croessmah Посмотреть сообщение
А может компилятор сделать так
Не могу вспомнить ничего, что мешало бы этому.
Из стандарта С:
Each non-bit-field member of a structure or union object is aligned in an implementation-defined manner appropriate to its type.
Так что, думаю, может.
1
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
22.03.2020, 18:47  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
blbulyan, вы же, вроде, нашли ответ на этот вопрос.
Если размер пустой структуры был бы ноль, то, например, сколько должен весить массив таких структур? Ноль? А все элементы этого массива лежали бы по одному адресу?
Ну тогда почему мне говорят что структура ничего не занимает? Как она может занимать и не занимать одновременно?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.03.2020, 18:48
blbulyan, место занимают объекты, а не типы. Часто говорят "структура", подразумевая "объект такой структуры".
0
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
22.03.2020, 18:49  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет. Это просто набор именованных констант.

Перечисление - это тоже тип. sizeof дал размер типа.
Если создадите объект перечисления, то он как раз будет занимать столько байт.
Тип можно указать вручную:
C++
1
2
enum HotKeysList: unsigned char {}
static_assert(sizeof(HotKeysList) == 1);
Откуда +1?

6 байт идет на отступы для выравнивания на 8 байт.
+1 от размера структуры, я прибавил размер постой структуры, выдаваемый sizeof
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.03.2020, 18:51
Цитата Сообщение от Croessmah Посмотреть сообщение
Если размер пустой структуры был бы ноль
В С, кстати, этот вопрос решили по-другому. Там такие пустые структуры вообще не разрешаются.
If the struct-declaration-list contains no named members, the behavior is undefined.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.03.2020, 18:56
Цитата Сообщение от DrOffset Посмотреть сообщение
В С, кстати, этот вопрос решили по-другому. Там такие пустые структуры вообще не разрешаются.
Скорее всего потому что для Си пустые структуры не имеют смысла
0
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
22.03.2020, 22:52  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
blbulyan, вы же, вроде, нашли ответ на этот вопрос.
Если размер пустой структуры был бы ноль, то, например, сколько должен весить массив таких структур? Ноль? А все элементы этого массива лежали бы по одному адресу?
Массив из пустых структур? Я не совсем понимаю, почему разрешено определять пустую структуру, а тут ещё и массив из них. Какой в этом смысл? Для чего это?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
22.03.2020, 23:31
Цитата Сообщение от blbulyan Посмотреть сообщение
Я не совсем понимаю, почему разрешено определять пустую структуру
Потому что структура\класс в С++ - это еще и область видимости. В которой могут быть разные члены, не только данные-члены, но и типы-члены (как в вашем случае с HotKeysList), функции-члены (если вы пропустили тему "функторы" в своем учебнике, то советую к ней вернуться и там вы увидите примеры пустых структуры с единственным членом-функцией), статические данные-члены и т.п. вещи, которые никак не влияют на ее размер.

Цитата Сообщение от blbulyan Посмотреть сообщение
ещё и массив из них
Это логически вытекает из того, что пустая структура с отсутствующими членами-данными возможна. Если она возможна, то возможно создать ее объект. А если возможно создать ее объект, значит можно создать и массив таких объектов.

То, что при всем вышеозвученном возможно создать структуру не содержащую вообще никаких членов, т.е. совершенно пустую, не особо влияет на результат - это просто частный случай. Факт в том, что если мы разрешили структуру в качестве полного типа без членов-данных, но при этом содержащую, например, функции-члены, то ее размер мы таки должны иметь возможность посчитать. И с точки зрения расчета этого значения совершенно пустая структура не будет отличаться от структуры с членами-функциями, потому что, как вы понимаете, члены-функции на размер никак не влияют. Точно так же как не влияет на него "совершенная пустота".

Добавлено через 10 минут
Цитата Сообщение от blbulyan Посмотреть сообщение
+1 от размера структуры, я прибавил размер постой структуры, выдаваемый sizeof
Его как раз не надо прибавлять.
Этот размер в единицу - это абстрактный размер. И сделан он для того, чтобы не нарушать требования к объектам в С++: "Каждый объект в момент своей жизни в программе должен иметь уникальный адрес".

Если мы позволяем создавать объекты нулевого размера, то автоматически нарушаем это требование.

Как только вы добавляете нестатические данные-члены в структуру этот размер в единицу перестает быть нужным, вместо него работает реальный, не абстрактный размер, который вычисляется по совокупности влияющих на размер членов и требований к их выравниванию.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.03.2020, 23:33
blbulyan,
Например в различном шаблонокоде пустые структуры тоже могут быть использованы.
https://ru.cppreference.com/w/cpp/types/enable_if
Посмотрите часть "возможная реализация"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2020, 23:33
Помогаю со студенческими работами здесь

Как хранится структура C++ в памяти?
Всем привет! Набросал небольшой тест (mingw): #include <iostream> #include <conio.h> //getch using namespace std; struct A ...

Массив как структура данных и размещение его в памяти
Добрый день! Как правильно ответить на вопрос почему в java можно написать Object x = new int? Что происходит при этом в памяти?

Структура современной связи как структура системы власти - как структура государственного управления
Структура современной связи всё больше становится структурой государственного управления, в особенности финансового государственного...

Сколько памяти имеет моя видеокарта?
У меня возник вопрос как посмотреть мою видеопамять . Я смотрел много видео но везде информация разная вот вся информация кто знает...

Как WebClient представляется серверу?
Здравствуйте, уважаемые форумчане, возник такой слегка отвлечённый вопрос. Использую WebClient в программе, в частности его метод...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru