Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Undisputed
216 / 144 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
1

Как формируется размер std::map?

31.10.2016, 12:23. Просмотров 460. Ответов 9
Метки нет (Все метки)

ожидал увидеть размер 18. По 5 байт на две строки и по 4 байта на два int-а.
Но результат 48. Почему? Как то связано с выравниванием данных?
http://rextester.com/GCONO62656
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2016, 12:23
Ответы с готовыми решениями:

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map<int, char> ksa;...

std::map нефикс. размер?
Нубо-вопрос, std::map и std::array имеют фиксированный размер, как и обычные...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве...

std::map, std::vector и порядок обхода коллекции
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения...

Стоит ли очищать в деструкторе std::map , std::vecotor?
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора,...

9
hoggy
Заблокирован
Эксперт С++
31.10.2016, 12:48 2
Цитата Сообщение от sys_beginner Посмотреть сообщение
Почему?
откройте исходник, и посмотрите, какие там данные-члены.
потом посмотрите сколько они весят.
и да - выравнивание.
1
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
31.10.2016, 12:48 3
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но результат 48. Почему?
Это размер объекта типа map,
а не размер данных,
которые он там у себя хранит.
Что касается этого размера,
то он зависит от реализации.
2
Undisputed
216 / 144 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
31.10.2016, 13:16  [ТС] 4
Ясно, спасибо

Добавлено через 2 минуты
А размер объекта это его данные + информация об объекте или только информация об объекте?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8105 / 4956 / 1436
Регистрация: 29.11.2010
Сообщений: 13,451
31.10.2016, 13:50 5
Цитата Сообщение от sys_beginner Посмотреть сообщение
А размер объекта это
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    char *p = new char[100500];
    std::cout << sizeof(p); // выведет размер указателя, а не 100500
    delete[] p;
}
2
Undisputed
216 / 144 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
31.10.2016, 19:49  [ТС] 6
MrGluck,
Понимаю. Мне интересно под что именно выводятся эти 48 байт. Причем размер имеет константное значение. Если добавляю новые поля или убираю поля - это значение не меняется. А вот когда создаю экземпляр своего класса, например
http://rextester.com/MPJO19375
Тогда размер экземпляра напрямую зависит от типа полей класса и их количества
Чем объясняется такое расхождение?
Ведь в двух случаях мы смотрим размер экземпляра но поведение sizeof разное
0
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
31.10.2016, 19:54 7
Цитата Сообщение от sys_beginner Посмотреть сообщение
А вот когда создаю экземпляр своего класса
а map это что по-вашему?
Цитата Сообщение от sys_beginner Посмотреть сообщение
Мне интересно под что именно выводятся эти 48 байт.
Под данные самого map.
map - не какая-то магическая фиговина,
это обычный шаблон обычного класса,
в котором, как и в Вашем классе
имеются какие-то данные, необходимые для работы.
0
Undisputed
216 / 144 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
31.10.2016, 20:00  [ТС] 8
Подозреваю, что объект использует исключительно указатели, в связи с этим размер объекта всегда константный.

Добавлено через 50 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
а map это что по-вашему?
Так в том то и дело. Отсюда и вопрос.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8105 / 4956 / 1436
Регистрация: 29.11.2010
Сообщений: 13,451
31.10.2016, 20:03 9
Цитата Сообщение от sys_beginner Посмотреть сообщение
Мне интересно под что именно выводятся эти 48 байт.
Легче всего это посмотреть в исходниках своего компилятора.
Память выделяется под ссылку на данные, внутренние объекты для реализация структуры данных (К/Ч дерево) со всякими узлами, флагами балансировки и т.д.
И само-собой, имеет место выравнивание данных.
0
Undisputed
216 / 144 / 38
Регистрация: 10.06.2014
Сообщений: 1,704
Завершенные тесты: 3
31.10.2016, 20:04  [ТС] 10
Цитата Сообщение от sys_beginner Посмотреть сообщение
Подозреваю, что объект использует исключительно указатели
Для работы с данными map-а
0
31.10.2016, 20:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2016, 20:04

Как реализован .end() std::map?
Как реализован .end() std::map? Не понимаю, какая у него реализация. Либо он...

Как заменить в файле строку, используя std::map?
Как сделать так чтобы из файла записывались строки Можно было выбрать какую...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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