Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
sim1246
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
#1

Std::set( vector ) и расход памяти - C++

14.05.2014, 10:40. Просмотров 1126. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2014, 10:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Std::set( vector ) и расход памяти (C++):

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

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

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

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

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

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

17
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
14.05.2014, 11:42 #2
Цитата Сообщение от sim1246 Посмотреть сообщение
Почему в случае set памяти больше чем size3?
м.б накладные расходы на контейнер ?)
0
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
14.05.2014, 11:43 #3
Давайте рассуждать логически. Множество в большинстве случаев имеет структуру в виде дерева, а значит ему необходим дополнительный объем памяти для хранения указателей правого и левого поддерева для каждого элемента. В случае вектора такие указатели не нужны так как выделяется непрерывный объем памяти.
Цитата Сообщение от sim1246 Посмотреть сообщение
Почему в случае set памяти больше чем size3?
Наверное имелось ввиду это:
C++
1
size3+=str.capacity() + sizeof(set<string>);
Так не проверяли? Потому как у вас явно указатели не входят в sizeof.
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
14.05.2014, 11:45 #4
set в данном случае наверняка RB-tree, каждый элемент содержит еще 2 указателя (минимум 4*2*100000 байт доп.расхода памяти)
0
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
14.05.2014, 11:46 #5
aLarman, ну вот и я об этом
0
sim1246
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
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
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
sim1246
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
14.05.2014, 12:16  [ТС] #8
Так по моему не совсем правильно все таки в векторе( сете ) у нас хранится string а не вектор( сет).
По сравнению с set вектор занимает меньше памяти понятно почему, а вот почему он занимает меньше по сравнению с size3 не понятно.
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
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
sim1246
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
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,601
Записей в блоге: 17
14.05.2014, 12:37 #11
Цитата Сообщение от aLarman Посмотреть сообщение
et в данном случае наверняка RB-tree, каждый элемент содержит еще 2 указателя
Три указателя, еще указатель для родителя.
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
14.05.2014, 12:38 #12
Цитата Сообщение от sim1246 Посмотреть сообщение
меньше чем size3.
а что в size3 я уже запутался

Добавлено через 18 секунд
Avazart, а да root еще
0
sim1246
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
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,601
Записей в блоге: 17
14.05.2014, 12:42 #14
Да при чем для вектора нужен один указатель независимо от кол-во элементов, а для множества нужно три указателя на каждый элемент- то есть линейно зависит от кол-ва элементов.
0
sim1246
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 8
14.05.2014, 12:44  [ТС] #15
вот ответ с stackoverflow ( там тоже спрашивал ) http://stackoverflow.com/questions/2...19176_23647756.
Перевод насколько я понял : Говорят что маленькие string в MS VS хранятся в непосредственно в самом string-e и capacity + sizeof(string) некорректно использовать.
0
14.05.2014, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2014, 12:44
Привет! Вот еще темы с ответами:

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

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

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...


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

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

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