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

На reserve не распространяется коэффициент роста, что ли? Если распространяется, то

я все равно не понимаю, что происходит, да и в любом случае какое-то ненормальное замедление.

21 ответов

22 просмотра

ну логика как будто хочет сказать что да, не распространяется Но ответа я не знаю

Maks
ну логика как будто хочет сказать что да, не распр...

https://en.cppreference.com/w/cpp/container/vector/reserve Раздел notes: Correctly using reserve() can prevent unnecessary reallocations, but inappropriate uses of reserve() (for instance, calling it before every push_back() call) may actually increase the number of reallocations (by causing the capacity to grow linearly rather than exponentially) and result in increased computational complexity and decreased performance. For example, a function that receives an arbitrary vector by reference and appends elements to it should usually not call reserve() on the vector, since it does not know of the vector's usage characteristics.

Думаю, можно утверждать, что точно не распространяется. Сколько просите в резёрве, столько и будет капасити (при увеличении).

Alex- Автор вопроса
Vanya Khodor
Думаю, можно утверждать, что точно не распространя...

Тогда использование reserve может быть антипаттерном, интересно

Vanya Khodor
Думаю, можно утверждать, что точно не распространя...

Я уже некоторое время назад задумывался над тем, что нужна перегрузка reserve, использующая экспоненциальную стратегию расширения. Может быть даже стоит предложить Антону.

magras
Я уже некоторое время назад задумывался над тем, ч...

А какое поведение? Если текущее капасити C, а reserve на C+x, то делать резёрв на kC, где k такое, чтобы (k-1)C<C+x≤kC?

Alex- Автор вопроса
magras
Я бы предложил max(requested, current*k).

Где k это стандартное 2?

А какой юз-кейс будет у данной перегрузки? Я пока его не вижу. reserve как раз таки используется тогда, когда известно сколько должно быть элементов в векторе, и в этом случае экспоненциальный рост не нужен точно. А если уж кто-то зачем-то хочет сделать reserve с экспоненциальным ростом, то ему скорее всего нужен не reserve, а push_back или range insert.

Daniel
А какой юз-кейс будет у данной перегрузки? Я пока ...

Exception safety: for unknown numer of iterations { v.reserve(v.size()+1); auto x = throwing_function(); // nothrow part v.push_back(x); }

magras
Exception safety: for unknown numer of iterations...

а зачем нам небросающий v.push_back(x), если у нас v.reserve бросит вместо него исключение?

Daniel
а зачем нам небросающий v.push_back(x), если у нас...

Чтобы вынести бросающий код из цикла например

Daniel
а зачем нам небросающий v.push_back(x), если у нас...

Как в общем случае пишется exception safe code? В начале выполняются все опасные операции, но результаты сохраняются только локально. И только когда все бросающие функции отработали успешно, фиксируем результат в выходных данных. Грубо говоря идея в том, что откат транзакции должен быть пустой операцией: тогда не нужно писать catch и явно обрабатывать исключения.

Basic guarantee: v.reserve(v.size()+1); auto x = throwing_function(); v.push_back(x); Strong guarantee: v.push_back(throwing_function()); А если у нас 'unknown number of iterations', то здесь ведь только basic получится (если v — инъектированная зависимость). А если мы с откатами хотим поменять v, то тогда уж copy-and-swap. Разделять push_back на reserve (с unlikely бранчем) + push_back имеет смысл только, если мы хотим сэкономить 1 вызов throwing_function после бросания исключения аллокатором.

Daniel
Basic guarantee: v.reserve(v.size()+1); auto x =...

> Strong guarantee: > v.push_back(throwing_function()); Здесь вы предполагаете что throwing_function можно откатить и что x реализует raii, а там может быть например отправка данных по сети.

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

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

а через 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
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта