Andrei
Не, не как раз.
Andrei
Я говорил про пушбек сверх резерва.
Andrei
Просто так код никто в своём уме не пишет.
Andrei
Обычно мы знаем сколько нам надо элементов в массиве.
Andrei
Всегда сначала делается reserve
Andrei
если нет, то опять же константа 2 это нормально
Andrei
и экспериментально ок
Andrei
потому что если даже предположить, что мы кладём в вектор чары, через 20 реаллокаций мы уже будем занимать мегабайт
Andrei
через 30 гигабайт
Andrei
часто у вас гигабайтные строки?
Andrei
Переаллоцируются еще при этом.
Andrei
Так что все эти рассказы про фрагментацию памяти это очень специфичный случай.
Andrei
и не нужно ни золотое сечение, ни полтора,
Andrei
2 это норм
Andrei
в противном случае никто не мешает вызывать самостоятельно reserve с нужными величинами
Andrei
Для этого не надо даже код вектора менять
Andrei
без строгой надобности это всё пустой совершенно спор.
Andrei
А если хоть где-то перформанс упирается в то, что вы в цикле херачите пушбек в заранее не аллоцированный вектор — это повод задуматься о дизайне вашей программы
Anatoly
Те же яйца вот ещё http://sim0nsays.livejournal.com/38116.html
Andrei
нет, вектор не на то.
Andrei
Вектор на то, чтобы мы безопасно использовали его как массив.
Anatoly
Andrei
с типобезопасностью, мувами, и сборкой мусора
Anatoly
2 это норм
Чувак, это ж совсем другая тема.
Andrei
через 30 будет 2^31
Andrei
значит гигабайт минимум
Andrei
не суть, всё равно такими данными никто не ворочает в векторе
Anatoly
Andrei
ЛИНЕЕН?
Andrei
что?
Andrei
пушбек это амортизированная константа
Andrei
ты о чем?
Алдар
Не помните, какие требования вектор накладывает на контейнер, насколько я помню контейнер должен иметь не бросающий исключения конструктор перемещения или конструктор копирования
Anatoly
Andrei
Алдар
нет, если ты хочешь пользовательский тип данных в вектор положить
Anatoly
Алдар
да, неверно написал, ограничения на тот тип данных, который хочешь хранить в векторе
Andrei
Зависит от того, что ты вызываешь.
Алдар
тот же пуш бек
Andrei
Вообще никаких.
Andrei
Сам по себе вектор никаких.
Алдар
а что будет если конструктор перемещения выбросит исключение?
Andrei
Ну выбросит и выбросит.
Andrei
std::terminate
Andrei
если он был помечен как noexcept
Алдар
ну вот, значит он должен быть помечен как noexcept
Anatoly
Я, кажется, понял вопрос. Можно ли будет этим самым вектором пользоваться после исключения дальше.
Алдар
http://stackoverflow.com/questions/8001823/how-to-enforce-move-semantics-when-a-vector-grows
Andrei
от типа T для вектора не требуется ничего, кроме полного определения и публичного деструктора
Andrei
для пушбека кот констрефа требуется CopyInsertable
Andrei
от rvalue MoveInsertable
Andrei
внутри вызывается std::move_if_noexcept
Andrei
который возвращает либо констреф если нет мувконструктора или он есть но бросает, либо рвэлью реф
Алдар
то есть если какой нить копи конструктор кинет исключение, то гарантируется базовая exception safety
Алдар
то есть вектор будет в каком то непонятном состоянии, что пользоваться им дальше не имеет смысла
Andrei
нет
Andrei
для пушбека не базовая
Andrei
для пушбека вообще ничего не будет
Алдар
ну смотри, если при пушбеке будет реаллокация
Andrei
там сильная гарантия
Алдар
то есть выделится кусок памяти в 2 раза больше
Алдар
потом начнётся вызов либо move либо копи конструктора, смотря что есть
Алдар
для каждого объекта
Алдар
и если в этот момент выкинется исключение
Andrei
Еще раз, пушбек имеет строгую гарантию, всё будет ок.
Andrei
Если выкинется исключение, то ничего страшного не произойдет.
Алдар
как будет ок?
Andrei
А почему не ок-то?
Алдар
потому что часть объектов переместится к примеру, а часть нет
Алдар
и что с этим хозяйством делать?
Andrei
Такого вообще не может быть.
Andrei
Скопированы может быть?
Алдар
такого не может быть, потому что вектор требует для move конструктора noexcept
Алдар
?
Andrei
Да.
Andrei
Если move конструктор выкинет исключение это будет std::terminate