| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Функция reserve() |
| Автор: IKM2007 30.7.2009, 20:50 | ||||
Нужно ли всегда использовать функцию reserve() контейнера vector? То есть если просто писать
то виделиться память равную 1Mb? А если писать
то виделится память равную 100*sizeof(int)? Можно поподробнее о плюсах и о минусах использования функции reserve() ? |
| Автор: Леопольд 30.7.2009, 21:47 | ||
Откуда эта цифра? |
| Автор: mes 30.7.2009, 21:53 | ||
с выводом не согласен. |
| Автор: andrew_121 30.7.2009, 22:02 |
Так если заранее известно кол-во элементов, значит все равно вектор зарезервирует этот объем памяти. Но при этом потратит больше времени на перевыделение. |
| Автор: zim22 30.7.2009, 22:09 |
надо было уточнить. это мой вывод да, я это и имел ввиду. |
| Автор: IKM2007 31.7.2009, 12:48 | ||
Прочитал в инете, было сказано о deque и vector, типа сравнивали, там говорилось, что vector выделяет память по Mb, а deque сколько нужно. То есть оба используют память одинаково? Добавлено через 5 минут и 37 секунд Ссылка на тот http://dvinogradov.blogspot.com/2006/03/deque-vs-vector.html. И еще вопрос, по какому принципу выделяется память? То есть ведь оно не выделяется поочередно для каждого элемента, а выделяется блоками, но какими? Добавлено через 7 минут и 3 секунды
Извиняюсь, не внимательно прочитал. |
| Автор: azesmcar 31.7.2009, 13:07 | ||
Там ничего подобного не сказано, там говорится что вектор каждый раз выделяет вдвое больше, чем выделено сейчас. Допустим vector<int> при создании по умолчанию выделяет 4000 байтов. Добавим в него 1000 элементов, память исчерпана, при добавлении очередного элемента вектор выделит 8000 байтов памяти а не 4001. Разумеется все эти числа условные, ибо ничего из сказанного не гарантировано, правда многие реализации STL так себя и ведут. Это можно проверить с помощью функции std::vector<T>::capacity(). |
| Автор: IKM2007 31.7.2009, 13:17 | ||||
azesmcar, но не совсем так у меня получилось. Вот поочередно проверял на сколько элементов выделялась память.
|
| Автор: azesmcar 31.7.2009, 13:19 | ||
| IKM2007 Я же говорю, это не гарантировано. Каждый поступает так, как считает нужным. Это похоже на микрософтовскую реализацию. Вот вывот этой же программы в gcc. Немного сократил, чтоб не занимать весь экран.
В этом случае эта тяжелая операция была произведена 8 раз, в случае со студией - 13. |
| Автор: IKM2007 31.7.2009, 13:27 |
| azesmcar, спасибо, все стало ясно. Вопрос исчерпан. |
| Автор: W4FhLF 31.7.2009, 15:07 | ||
Прочитай Herb Sutter. Решение сложных задач на С++.Exceptional C++ (2002). "Задача 1.14 Использование vector и deque". В силу своей специфики deque хранит все данные в блоках равного размера и максимум, что выделяет -- это новый блок при необходимости. |
| Автор: IKM2007 31.7.2009, 16:10 |
| W4FhLF, прочитал. Теперь вопрос полностью исчерпан. Спасибо. |