0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
||||||
1 | ||||||
Std::set( vector ) и расход памяти14.05.2014, 10:40. Просмотров 2881. Ответов 17
Метки нет Все метки)
(
Здравствуйте!
Пытаюсь разобраться сколько памяти съедают контейнеры и никак не могу понять следующее. Вот есть код( ниже) В конце стоит бесконечный цикл(знаю что так делать нельзя) только для того чтобы в таск менеджере посмотреть сколько памяти мы съели. На экран выводится: size1= 0.4666; size2 = 1,430; size3 = 4,1008 При этом в таск менеджере расход показывает 6,11 Если set заменить на вектор ( выделив ему память ровно столько сколько элементов ) то вывод останется таким же а в таск менеджере мы увидим число 3,45. Почему в случае set памяти больше чем size3? и меньше в случае вектора? Спасибо Upd в строке 3 vtos() преобразует число в строку
0
|
|
14.05.2014, 10:40 | |
Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? Представление памяти std::vector std::vector Перераспределение памяти |
|
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
14.05.2014, 11:42 | 2 |
0
|
![]() |
||||||
14.05.2014, 11:43 | 3 | |||||
Давайте рассуждать логически. Множество в большинстве случаев имеет структуру в виде дерева, а значит ему необходим дополнительный объем памяти для хранения указателей правого и левого поддерева для каждого элемента. В случае вектора такие указатели не нужны так как выделяется непрерывный объем памяти.
Наверное имелось ввиду это:
0
|
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
14.05.2014, 11:45 | 4 |
set в данном случае наверняка RB-tree, каждый элемент содержит еще 2 указателя (минимум 4*2*100000 байт доп.расхода памяти)
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
|
14.05.2014, 11:48 [ТС] | 6 |
sizeof(set<string> ) как и sizeof(vector<string> ) равен 16. В строке которую вы привели я попытался посчитать сколько памяти съедает сам string который лежит в set( его значение 28 ) и его содержимое.
Добавлено через 58 секунд Спасибо, но не понятно с вектором почему вектор меньше чем 4,1
0
|
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
14.05.2014, 12:12 | 7 | |||||
потому что вектор расходует меньше памяти чем set написано ж выше
![]() Добавлено через 4 минуты тогда Вам скорее всего надо сделать так
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
|
14.05.2014, 12:16 [ТС] | 8 |
Так по моему не совсем правильно все таки в векторе( сете ) у нас хранится string а не вектор( сет).
По сравнению с set вектор занимает меньше памяти понятно почему, а вот почему он занимает меньше по сравнению с size3 не понятно.
0
|
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
14.05.2014, 12:22 | 9 | |||||
даж так
Добавлено через 47 секунд так Вы же в size3 добавляете еще capacity() каждой из строк ![]() Добавлено через 2 минуты неправильно делаете, Вы тут копируете строку, а в ней capacity может отличаться от той что в *it
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
||||||
14.05.2014, 12:27 [ТС] | 10 | |||||
Все равно не понятно почему вектор почти на пол мегабайта меньше чем size3.
0
|
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
14.05.2014, 12:38 | 12 |
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
||||||
14.05.2014, 12:40 [ТС] | 13 | |||||
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
|
14.05.2014, 12:44 [ТС] | 15 |
вот ответ с stackoverflow ( там тоже спрашивал ) http://stackoverflow.com/quest... 6_23647756.
Перевод насколько я понял : Говорят что маленькие string в MS VS хранятся в непосредственно в самом string-e и capacity + sizeof(string) некорректно использовать.
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
|
14.05.2014, 12:57 [ТС] | 17 |
Сейчас посмотрю, но тогда получается что и для set вычисления не верны, тогда вообще не понятно куда память девается
0
|
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
|
|
15.05.2014, 14:19 [ТС] | 18 |
Вообщем всем спасибо кто принял участие в обсуждении. Сам string занимает 28 байт + примерно 14 байт для каждого элемента сета. Итого на один элемент получатся 32 байта. Ну примерно та же цифра в 4 мб получается, остальное на stackoverflow списали на всякие загруженные либы и так далее.
Добавлено через 33 секунды Указанные цифры верны только для MSVC реализации string и set
0
|
15.05.2014, 14:19 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Reallocation памяти контейнера std::vector Реализация своего std::vector c аллокатором памяти
Как изменять размер std::vector<std::vector>? Вывести значения std::vector<std::vector<int*> > Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |