170 похожих чатов

Я же правильно понимаю что вектор при вызове resize() в

меньшую сторону не делает реаллокацию ?

23 ответов

20 просмотров

Не гарантированно, но вроде обычно нет

Может и делать...

Главное - зачем тебе это знать?

там есть еще shrink_to_fit(), это как раз чтобы уменьшить потребляемую память, если resize в меньшу сторону был

Ilya Zviagin
Главное - зачем тебе это знать?

Ну как, к примеру либо использовать одну переменную типа вектор и ее ресайзить либо каждый раз новую.

нет, если resize в меньшую сторону, то он имеет право сделать реалокацию, только вот никто из существующих компиляторов такой фигней не занимаются

Александр Водянников
Ну как, к примеру либо использовать одну переменну...

ну если ты хочешь переиспользовать вектор каким то образом, типо положил 20 штук, забыл их, дальше опять начал накладывать новые, то как минимум там нужно вызывать деструкторы и сложность окажется линейной(95%, что там в случае тривиального случая они всё же просто забудутся)

Till Schneider
нет, если resize в меньшую сторону, то он имеет пр...

не наблюдаю в нормативном тексте resize() право инвалидировать все итераторы. такое явно пишут, по-моему

Vlad
не наблюдаю в нормативном тексте resize() право ин...

Там пишут о инвалидации текущей или следующих позиций Инвалидация != реалокация

Till Schneider
Там пишут о инвалидации текущей или следующих пози...

Именно, об инвалидации следующих позиций. Этого достаточно, чтобы трактовать как гарантию отсутствия инвалидации предыдущих. Возможно ли гарантировать отсутствие инвалидации при реалокации?

Till Schneider
Там пишут о инвалидации текущей или следующих пози...

если, как вы говорите, resize() может сделать реаллокацию, то инвалидировано будет все, а не только с текущей позиции и до конца shrink_to_fit() и тот инвалидирует все

Vlad
если, как вы говорите, resize() может сделать реал...

а если рассмотреть какую-то систему "сферический конь в вакууме", на которой возможно совершать реалокацию в меньшую сторону, просто высвобождая память неиспользуемых элементов, при этом не затрагивать ту память, которая была выделена под имеющиеся элементы?

Till Schneider
а если рассмотреть какую-то систему "сферический к...

но ведь задача стандарта как раз найти общее поведение, которое не будет противоречить большинству систем. Таким образом, даже если на описанной вами системе такое возможно, то мы все равно будем считать, что они инвалидировались, так как нам важна переносимость

Till Schneider
а если рассмотреть какую-то систему "сферический к...

Так это на любой системе можно, вот хоть прямо на Винде. Тем более что весьма вероятно что новый кусок памяти будет другим, и старый можно будет использовать полностью

Till Schneider
а если рассмотреть какую-то систему "сферический к...

да, такое теоретически возможно, но я не вижу, чтобы стандарт требовал существование такого механизма от реализаций (либо я не нахожу, чтобы требовал). зато нахожу еще одно упоминание реаллокации, которая все инвалидирует поэтому если такая чудесная реаллокация и будет выполнена реализацией, она не будет реаллокацией в терминах стандарта, то есть не будет ничего инвалидировать

Vlad
да, такое теоретически возможно, но я не вижу, что...

>> она не будет реаллокацией в терминах стандарта Я не уверен, но означает ли инвалидация, что адреса элементов будут буквально изменены? Если нет – инвалидация у нас всё-равно случалась, хотя адреса и не изменились – для нас это ничего не значит, мы всё равно не имеем права обращаться к данным по инвалидированным указателям из-за UB. А если обратимся и обнаружим, что элемент на месте – ничего страшного, ожидаемое поведение – тоже одно из проявлений UB

Ofee Oficsu
>> она не будет реаллокацией в терминах стандарта ...

я думаю, что она значит, что они могут измениться, потому что никто не требует от реализаций расширять текущий storage если адреса не поменялись и мы пользуемся старыми указателями и ссылками, то это даже не UB благодаря transparently replaceable, если я ничего не упускаю

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта