Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

как избежать дублирования в RAM своих типов?

24.06.2021, 07:31. Показов 1524. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. сразу прошу прощения за непрофессиональную трактовку
2. суть не в байтах/мегабайтах а в самом вопросе - дублирование


Написал небольшой класс, внутри создал структуру, для простоты примера возьмём такую
C++
1
2
3
4
5
6
    struct {
      bool zero  : 1;
      bool case : 1;
      bool boot : 1;
      bool base  : 1;
    } data = {1, 0, 1, 0};
которую даже нигде не использовал в коде. Во первых я ожидал что компилятор оптимизирует её и она вообще не будет занимать RAM.
Во вторых я ожидал что оперативка уменьшиться на 1 байт. Она уменьшилась на 2. я про это нигде не нашёл инфы но (поправьте меня если это не так) думаю это изза того что:
1 байт отжирает сам тип наших данных/структуры. причём этот байт(или другой размер при другой структуре) условно говоря заканчивается на закрывающей фигурной скобке.
а второй байт отжирает объявленная наша переменная указаного типа/структуры, т.е. сама data.
правильно?

А теперь собственно вопрос:
если мне нужна только одна единственная переменная данного типа. т.е. этот тип используется единожды на все века ТО
есть ли какойто способ создать такую переменную без дублирования размера в оперативке ?
незнаю, написать какойто атрибут (перед/после структуры) или там использовать какието ассемблерные вставки, любой способ так чтоб data заняла один байт а не два ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2021, 07:31
Ответы с готовыми решениями:

Как избежать дублирования кода в Си
Допустим, есть такие структуры данных: enum Color{ Red, Blue, Black, White }; struct Car{ char*...

Как избежать дублирования пользователей?
Как сделать, что бы при добавление в БД пользователи не повторялись Дополните код: MySqlCommand sqlCmd = new...

Как избежать дублирования сообщений ?
В гостевой книге или в форуме. Заполняешь форму отсылаешь, и вдруг взбрело в голову обновить страницу, и она вызыватся с теми же...

15
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
24.06.2021, 07:48
Цитата Сообщение от alexbmd Посмотреть сообщение
Написал небольшой класс, внутри создал структуру, для простоты примера возьмём такую
И где же реальный код?

Цитата Сообщение от alexbmd Посмотреть сообщение
Во вторых я ожидал что оперативка уменьшиться на 1 байт. Она уменьшилась на 2.
Это бессмысленный набор слов. "оперативка уменьшиться" - что это вообще?

Цитата Сообщение от alexbmd Посмотреть сообщение
думаю это изза того что:1 байт отжирает сам тип наших данных/структуры. 1 байт отжирает сам тип наших данных/структуры. причём этот байт(или другой размер при другой структуре) условно говоря заканчивается на закрывающей фигурной скобке.
а второй байт отжирает объявленная наша переменная указаного типа/структуры, т.е. сама data.
правильно?
Нет. Полная бессмыслица. Не существует никакого "сам тип наших данных".

Цитата Сообщение от alexbmd Посмотреть сообщение
так чтоб data заняла один байт а не два ?
Она и так занимает один байт. Все остальное что вы тут наговорили - какая белиберда, смысл которой не ясен.
0
Just Do It!
 Аватар для XLAT
4190 / 2645 / 654
Регистрация: 23.09.2014
Сообщений: 8,925
Записей в блоге: 3
24.06.2021, 09:17
Цитата Сообщение от alexbmd Посмотреть сообщение
любой способ так чтоб data заняла один байт а не два ?
ваша проблема очень сложная:
https://ideone.com/M2uj5n
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
24.06.2021, 18:33  [ТС]
XLAT, в моём примере тоже самое. чем ваш пример отличается от моего ?

и вы не внимательно читали а читалили ?
создать такую переменную без дублирования размера в оперативке
Добавлено через 4 минуты
TheCalligrapher, я сразу предупредил что не профессионал в сишной лексике. любая программа при выполнени занимает какойто объём оперативки. можно написать две программы , которые будут одинаково занимать место на жестком диске. выдавать одинаковый результат. но занимать разный объём в оперативной памяти. оперативка умешилась - это значит что доступный свободный объем оперативной памяти уменшился.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.06.2021, 18:50
Цитата Сообщение от alexbmd Посмотреть сообщение
в моём примере тоже самое. чем ваш пример отличается от моего ?
В его примере программа выводит размер 1.

Так что давайте вы начнете с того, что у вас уже попросили:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И где же реальный код?
Полный код сюда выложите, вместе со всеми его частями, в том числе с той, где получается размер.

Добавлено через 3 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
1 байт отжирает сам тип наших данных/структуры. причём этот байт(или другой размер при другой структуре) условно говоря заканчивается на закрывающей фигурной скобке.
Это абсолютно неверно.
"Сам тип данных" существует только на этапе компиляции и никакой "оперативки" в программе не "отжирает".
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
24.06.2021, 19:13
Цитата Сообщение от alexbmd Посмотреть сообщение
в моём примере тоже самое. чем ваш пример отличается от моего ?
О каком "тоже самое" вы ведете речь, если в примере XLAT размер равен 1, а не ваши загадочные 2?

Цитата Сообщение от alexbmd Посмотреть сообщение
оперативка умешилась - это значит что доступный свободный объем оперативной памяти уменшился.
Что такое "оперативка" и как вы меряли эту "оперативку"? Где и как вы умудрились увидеть, что "доступный свободный объем оперативной памяти уменьшился" да еще и с точностью до одного байта?
1
Just Do It!
 Аватар для XLAT
4190 / 2645 / 654
Регистрация: 23.09.2014
Сообщений: 8,925
Записей в блоге: 3
24.06.2021, 21:41
Цитата Сообщение от alexbmd Посмотреть сообщение
без дублирования размера в оперативке
ну, вот без дублирования:
https://ideone.com/iOhGOL

оно?
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
28.06.2021, 17:24  [ТС]
XLAT, извините если неясно объяснил... я имел ввиду что сам тип и перменная этого типа съели выделенный размер. в данном примере каждый по байту...
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Где и как вы умудрились увидеть
IDE arduino, но и на никсах/винде вроде несложно написать такую функцию
DrOffset, сори, я видел что попросили, но не получается уже "поймать" такой код, чтоб продемонстрировать разницу. на данный момент имея скажем такую структуру
C++
1
2
3
4
5
    struct stream {
      bool leadzero : 1, uppercase : 1, boolalpha : 1, showbase : 1;
    } output = {1, 1, 1, 1};
...
        if (output.leadzero) {..}
и затем её удалив
C++
1
2
3
4
5
    /*struct stream {
      bool leadzero : 1, uppercase : 1, boolalpha : 1, showbase : 1;
    } output = {1, 1, 1, 1};*/
...
        if (1) {..}
я получаю ровно один и тотже размер свободной памяти... но стоит мне структуру увеличить на один байт как память уменьшаеться на два
C++
1
2
3
4
5
    struct stream {
      unsigned char precision : 6;
      bool leadzero : 1, uppercase : 1, boolalpha : 1, showbase : 1;
    } output = {0, 1, 1, 1, 1};
...
т.е. получается если "Сам тип данных" существует только на этапе компиляции" то :
1) когда структура была 1 байт компилятор выходит её так сильно оптимизировал что она вообще "пропала" из оперативки. правда я не понимаю как он мог так её оптимизировать при том что if (output.leadzero) {..} продолжало работать
2) а уже когда структура стала занимать 2 целых байта компилятор не смог её оптимизировать и она уже "всплыла" скушав 2 байта в оперативки.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
28.06.2021, 19:18
Цитата Сообщение от alexbmd Посмотреть сообщение
когда структура была 1 байт компилятор выходит её так сильно оптимизировал что она вообще "пропала" из оперативки. правда я не понимаю как он мог так её оптимизировать при том что if (output.leadzero) {..} продолжало работать
Это очень просто может быть. Значение ваших битовых полей известны на этапе компиляции. Компилятор подставил значение по месту в условие, объект, если он не используется, вполне может быть убран из программы. Собственно и условие скорее всего тоже выбросил.
Однако ничего точно утверждать без полного кода, который вы упорно не хотите предоставить, нельзя. То или иное поведение, оптимизации, очень сильно зависят от контекста, а его-то как раз вы и не даете.

Добавлено через 2 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
а уже когда структура стала занимать 2 целых байта компилятор не смог её оптимизировать и она уже "всплыла" скушав 2 байта в оперативки.
Это опять же зависит от контекста, может или не может.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
28.06.2021, 19:22
alexbmd, используй std::vector<bool> и перестань изобретать велосипед
0
28.06.2021, 19:35

Не по теме:

Kuzia domovenok, насколько я помню, у него там что-то вроде Arduino. Так что это не вариант для него.

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
28.06.2021, 19:59
Цитата Сообщение от alexbmd Посмотреть сообщение
я получаю ровно один и тотже размер свободной памяти... но стоит мне структуру увеличить на один байт как память уменьшаеться на два
Ну так а почему вместо очевидной и сразу приходящей в голову мысли о том, что память на вашей платформе распределяется по два байта (выравнивание или что-то в этом роде), то есть о том, что ваши "память уменьшаеться на два" никакого отношения к самой структуре не имеют вообще, вы начали строить какие-то странные предположения о "память занимает тип структуры" и т.п. загадочные теории?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.06.2021, 20:08
alexbmd, любые битовые поля наполняют структуры, состоящей из целого числа байтов (не битов!). Потому что байт - минимальная единица, с которой могут работать процессоры. Так что пока битовых полей по 1 биту меньше или равно 8, то занимает 1 байт, если 9 и до 16 включительно - 2 байта, и т.д.


Ключевое слово case в качестве имени поля недопустимо.

Добавлено через 4 минуты
Цитата Сообщение от alexbmd Посмотреть сообщение
if (1)
Этот if компилятор вообще выкидывает, т.е. -1 инструкция процессору как минимум.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
30.06.2021, 16:58  [ТС]
DrOffset, пока не получается подобрать лаконичный и работающий код... показывающий разницу... а не потому что "у меня велосипеда не было" (с) Печкин

TheCalligrapher, не похоже. если я добавлю другой мембер класса volatile char a = 100;. оперативка уменьшится на один а не на два.

https://stackoverflow.com/ques... me-using-c запускаю отсюда скрипты и чтото они все разный результат дают на одной и той же системе

TRam_, да я это знаю. говоря выше про структуру из 10 бит я знаю что она занимает 2 байта ровно. но еще зависит не только от полей но и типа. {unsigned a:1} будет занимать 4 байта а не 1. и я в начале немог понять почему.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.06.2021, 17:05
Цитата Сообщение от alexbmd Посмотреть сообщение
unsigned a:1} будет занимать 4 байта а не 1. и я в начале немог понять почему.
Выравнивание.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.06.2021, 18:13
Цитата Сообщение от alexbmd Посмотреть сообщение
{unsigned a:1} будет занимать 4 байта а не 1. и я в начале немог понять почему.
Тип unsigned в С и С++ это один из псевдонимов типа unsigned int, который в 32-битных системах занимает 4 байта. Так что если объявляется даже 1 битовое поле для этого типа, то будет выделено место под всю переменную этого типа. А вот сделали бы поле unsigned char - бы бы 1 байт.

По выравниванию - если сделаете {unsigned short a:1; unsigned char b:1;} то структура будет занимать не 3 байта, а 4 из-за выравнивания.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2021, 18:13
Помогаю со студенческими работами здесь

Как избежать дублирования записей?
Вопрос, наверное, совсем идиотский, но я новичок, уж простите. Создал в MS SQL таблицу Owners с двумя полями (*OwnerID, FIO). OwnerID...

Как избежать дублирования кода?
Приветствую Вас уважаемые форумчане! Хочу обратиться к Вам за помощью. Возникли огромные пробелы в Java OOP , либо же я не до конца...

как избежать дублирования подключения библоитек
как избежать дублирования подключения библоитек , например delay ? когда я делаю проект , приходится почти в каждом подключенном файле...

Как избежать дублирования в составном ключе
Итак, есть БД (диаграма предлагается), сущности - Исполнители, Песни, Альбомы и СодержимоеАльбомов. Задание: &quot;Для заданного...

Как избежать дублирования кода? Наследование
Здравствуйте. У меня следующая проблема: Есть несколько классов: A, B, C. Они наследуются от основного класса: BASE Есть по одному...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru