![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: нет Всего: 40 |
Нужно ли всегда использовать функцию reserve() контейнера vector? То есть если просто писать
то виделиться память равную 1Mb? А если писать
то виделится память равную 100*sizeof(int)? Можно поподробнее о плюсах и о минусах использования функции reserve() ? -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
reserve резервирует кусок памяти. плюсы - если заранее можно просчитать, сколько элементов приблизительно будет в векторе - то можно зарезервировать в самом начале использования этого вектора необходимый объём памяти под элементы. и не будет вызываться функция reallocation'a каждый раз, когда размер вектора будет больше, чем он сможет вместить. минусы - отнимает у ОС память, которая может не быть использована. *** вывод: не используйте reserve, если производельность программы вас устраивает. *** подробнее о reserve в гугле и msdn |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Откуда эта цифра? -------------------- вопросов больше чем ответов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Так если заранее известно кол-во элементов, значит все равно вектор зарезервирует этот объем памяти. Но при этом потратит больше времени на перевыделение. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
надо было уточнить. это мой вывод да, я это и имел ввиду. |
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: нет Всего: 40 |
Прочитал в инете, было сказано о deque и vector, типа сравнивали, там говорилось, что vector выделяет память по Mb, а deque сколько нужно. То есть оба используют память одинаково? Добавлено через 5 минут и 37 секунд Ссылка на тот ресурс.. И еще вопрос, по какому принципу выделяется память? То есть ведь оно не выделяется поочередно для каждого элемента, а выделяется блоками, но какими? Добавлено через 7 минут и 3 секунды
Извиняюсь, не внимательно прочитал. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Там ничего подобного не сказано, там говорится что вектор каждый раз выделяет вдвое больше, чем выделено сейчас. Допустим vector<int> при создании по умолчанию выделяет 4000 байтов. Добавим в него 1000 элементов, память исчерпана, при добавлении очередного элемента вектор выделит 8000 байтов памяти а не 4001. Разумеется все эти числа условные, ибо ничего из сказанного не гарантировано, правда многие реализации STL так себя и ведут. Это можно проверить с помощью функции std::vector<T>::capacity(). |
|||
|
||||
| IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: нет Всего: 40 |
azesmcar, но не совсем так у меня получилось. Вот поочередно проверял на сколько элементов выделялась память.
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
IKM2007
Я же говорю, это не гарантировано. Каждый поступает так, как считает нужным. Это похоже на микрософтовскую реализацию. Вот вывот этой же программы в gcc. Немного сократил, чтоб не занимать весь экран.
В этом случае эта тяжелая операция была произведена 8 раз, в случае со студией - 13. Это сообщение отредактировал(а) azesmcar - 31.7.2009, 13:30 |
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: нет Всего: 40 |
azesmcar, спасибо, все стало ясно. Вопрос исчерпан.
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Прочитай Herb Sutter. Решение сложных задач на С++.Exceptional C++ (2002). "Задача 1.14 Использование vector и deque". В силу своей специфики deque хранит все данные в блоках равного размера и максимум, что выделяет -- это новый блок при необходимости. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: нет Всего: 40 |
W4FhLF, прочитал. Теперь вопрос полностью исчерпан. Спасибо.
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |