Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
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() преобразует число в строку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    
set<string> res;
    for(uint x = 0; x<100000;++x) res.insert( vtos(x,0) );
    uint result = 0;
    cout << "Res.size() == " << res.size() << endl;
    uint size1=0;uint size2=0;uint size3=0;
    set<string>::const_iterator it=res.begin();
    for(;it!=res.end();++it){
        string str = *it;
        size1+=str.size();
        size2+=str.capacity();
        size3+=str.capacity() + sizeof(string);
}
    cout << "size1 == " << ((float)size1)/1024/1024 << endl;
    cout << "size2 == " << ((float)size2)/1024/1024 << endl;
    cout << "size3 == " << ((float)size3)/1024/1024 << endl;
while(true){}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2014, 10:40
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор....

Представление памяти std::vector
Добрый день! Вопрос по вектору, из его описание следует, что он располагает свои элементы линейно...

std::vector Перераспределение памяти
Код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;tchar.h&gt;...

17
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.05.2014, 11:42 2
Цитата Сообщение от sim1246 Посмотреть сообщение
Почему в случае set памяти больше чем size3?
м.б накладные расходы на контейнер ?)
0
Эксперт С++
1889 / 1237 / 354
Регистрация: 16.05.2013
Сообщений: 3,239
Записей в блоге: 6
14.05.2014, 11:43 3
Давайте рассуждать логически. Множество в большинстве случаев имеет структуру в виде дерева, а значит ему необходим дополнительный объем памяти для хранения указателей правого и левого поддерева для каждого элемента. В случае вектора такие указатели не нужны так как выделяется непрерывный объем памяти.
Цитата Сообщение от sim1246 Посмотреть сообщение
Почему в случае set памяти больше чем size3?
Наверное имелось ввиду это:
C++
1
size3+=str.capacity() + sizeof(set<string>);
Так не проверяли? Потому как у вас явно указатели не входят в sizeof.
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.05.2014, 11:45 4
set в данном случае наверняка RB-tree, каждый элемент содержит еще 2 указателя (минимум 4*2*100000 байт доп.расхода памяти)
0
Эксперт С++
1889 / 1237 / 354
Регистрация: 16.05.2013
Сообщений: 3,239
Записей в блоге: 6
14.05.2014, 11:46 5
aLarman, ну вот и я об этом
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 минуты
Цитата Сообщение от sim1246 Посмотреть сообщение
сам string который лежит в set( его значение 28 ) и его содержимое.
тогда Вам скорее всего надо сделать так
C++
1
2
3
4
5
6
7
8
for(;it!=res.end();++it){
        string str = *it;
        size1+=str.size();
        size2+=str.capacity();
        //size3+=str.capacity() + sizeof(string);
}
size3 = size2+res.capacity()*sizeof(vector<string>);//вектор
//size3 = size2+res.size()*sizeof(set<string>); для set
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
даж так
C++
1
size3 = size2+sizeof(res);+res.capacity()*sizeof(string)//в случае сета res.size();
size2 это память выделенная на все строки, эти строки хранятся в векторе, т.е каждый элемент это есть string, и элементы в векторе хранятся в виде массива, размер массива capacity() т.е capacity()*sizeof(string) получаем размер массива(хранящегося в векторе) + размер массивов каждой из строк + размер самого контейнера sizeof(res)

Добавлено через 47 секунд
так Вы же в size3 добавляете еще capacity() каждой из строк

Добавлено через 2 минуты
Цитата Сообщение от aLarman Посмотреть сообщение
string str = *it;
неправильно делаете, Вы тут копируете строку, а в ней capacity может отличаться от той что в *it
0
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
14.05.2014, 12:27  [ТС] 10
так Вы же в size3 добавляете еще capacity() каждой из строк
C++
1
size3 = size2+sizeof(res) +res.capacity()*sizeof(string)
Эта строка отличается от моей только наличием sizeof( res). Повторюсь что в моем случае для вектора size=capacity специально проверяю.
неправильно делаете, Вы тут копируете строку, а в ней capacity может отличаться от той что в *it
С этим согласен переделал на (*it).size && (*it).capacity(). Результат тот же.
Все равно не понятно почему вектор почти на пол мегабайта меньше чем size3.
0
Эксперт С++
8341 / 6090 / 607
Регистрация: 10.12.2010
Сообщений: 28,333
Записей в блоге: 29
14.05.2014, 12:37 11
Цитата Сообщение от aLarman Посмотреть сообщение
et в данном случае наверняка RB-tree, каждый элемент содержит еще 2 указателя
Три указателя, еще указатель для родителя.
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
14.05.2014, 12:38 12
Цитата Сообщение от sim1246 Посмотреть сообщение
меньше чем size3.
а что в size3 я уже запутался

Добавлено через 18 секунд
Avazart, а да root еще
0
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
14.05.2014, 12:40  [ТС] 13
а что в size3 я уже запутался
C++
1
size3=size2 + sizeof(string)*res.capacity() + sizeof(vector<string>())
0
Эксперт С++
8341 / 6090 / 607
Регистрация: 10.12.2010
Сообщений: 28,333
Записей в блоге: 29
14.05.2014, 12:42 14
Да при чем для вектора нужен один указатель независимо от кол-во элементов, а для множества нужно три указателя на каждый элемент- то есть линейно зависит от кол-ва элементов.
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
Эксперт С++
8341 / 6090 / 607
Регистрация: 10.12.2010
Сообщений: 28,333
Записей в блоге: 29
14.05.2014, 12:49 16
Заглянуть посмотреть в исходнки реализации ?
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2014, 14:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Reallocation памяти контейнера std::vector
расширение памяти в этом контейнере происходит по логарифмическому закону. Объясните , пожалуйста,...

Реализация своего std::vector c аллокатором памяти
Приветствую всех. Пытаюсь реализовать свой std::vector с аллокатором памяти и всеми конструкторами...

Обеспечивает ли std::vector непрерывность памяти и как?
Здравствуйте! Если я не ошибаюсь, std::vector обеспечивает непрерывность выделенной памяти для...

Правильное освобождение памяти при std::vector
vector&lt;Worker*&gt; workers; workers.push_back(new Worker(&quot;Jack&quot;, 1000)) Как теперь правильно...

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

Вывести значения std::vector<std::vector<int*> >
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3;...


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

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

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