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

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

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

21 ответов

25 просмотров

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

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, а там может быть например отправка данных по сети.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта