меньшую сторону не делает реаллокацию ?
Не гарантированно, но вроде обычно нет
Может и делать...
Главное - зачем тебе это знать?
Ты уверен, что не гарантированно?
там есть еще shrink_to_fit(), это как раз чтобы уменьшить потребляемую память, если resize в меньшу сторону был
Ну как, к примеру либо использовать одну переменную типа вектор и ее ресайзить либо каждый раз новую.
Мне как раз это и не надо
Используй одну, но не делай resize
нет, если resize в меньшую сторону, то он имеет право сделать реалокацию, только вот никто из существующих компиляторов такой фигней не занимаются
ну если ты хочешь переиспользовать вектор каким то образом, типо положил 20 штук, забыл их, дальше опять начал накладывать новые, то как минимум там нужно вызывать деструкторы и сложность окажется линейной(95%, что там в случае тривиального случая они всё же просто забудутся)
вектор uint8_t типов
это строка хД
не наблюдаю в нормативном тексте resize() право инвалидировать все итераторы. такое явно пишут, по-моему
Там пишут о инвалидации текущей или следующих позиций Инвалидация != реалокация
Именно, об инвалидации следующих позиций. Этого достаточно, чтобы трактовать как гарантию отсутствия инвалидации предыдущих. Возможно ли гарантировать отсутствие инвалидации при реалокации?
если, как вы говорите, resize() может сделать реаллокацию, то инвалидировано будет все, а не только с текущей позиции и до конца shrink_to_fit() и тот инвалидирует все
а если рассмотреть какую-то систему "сферический конь в вакууме", на которой возможно совершать реалокацию в меньшую сторону, просто высвобождая память неиспользуемых элементов, при этом не затрагивать ту память, которая была выделена под имеющиеся элементы?
но ведь задача стандарта как раз найти общее поведение, которое не будет противоречить большинству систем. Таким образом, даже если на описанной вами системе такое возможно, то мы все равно будем считать, что они инвалидировались, так как нам важна переносимость
Так это на любой системе можно, вот хоть прямо на Винде. Тем более что весьма вероятно что новый кусок памяти будет другим, и старый можно будет использовать полностью
да, такое теоретически возможно, но я не вижу, чтобы стандарт требовал существование такого механизма от реализаций (либо я не нахожу, чтобы требовал). зато нахожу еще одно упоминание реаллокации, которая все инвалидирует поэтому если такая чудесная реаллокация и будет выполнена реализацией, она не будет реаллокацией в терминах стандарта, то есть не будет ничего инвалидировать
>> она не будет реаллокацией в терминах стандарта Я не уверен, но означает ли инвалидация, что адреса элементов будут буквально изменены? Если нет – инвалидация у нас всё-равно случалась, хотя адреса и не изменились – для нас это ничего не значит, мы всё равно не имеем права обращаться к данным по инвалидированным указателям из-за UB. А если обратимся и обнаружим, что элемент на месте – ничего страшного, ожидаемое поведение – тоже одно из проявлений UB
я думаю, что она значит, что они могут измениться, потому что никто не требует от реализаций расширять текущий storage если адреса не поменялись и мы пользуемся старыми указателями и ссылками, то это даже не UB благодаря transparently replaceable, если я ничего не упускаю
Обсуждают сегодня