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

Есть такой код, он нормально работает. idx это std::vector<uint32_t>, idxLast

это uint32_t:

idx.push_back(idxLast+0); idx.push_back(idxLast+1); idx.push_back(idxLast+2);
idx.push_back(idxLast+1); idx.push_back(idxLast+2); idx.push_back(idxLast+3);

Добавил перед ним idx.reserve(idx.size() + 6); - код стал в 30 (!!!) раз медленнее, и висит в коллстеке на скриншоте выше.
???

15 ответов

12 просмотров

idx.reserve(idx.size() + max(6, idx.size()/2))

В чем сакральный смысл reserve(size()/2)?🤔

Только этот код ничего не делает (если, конечно, в посте не опечатка)

Nikita Kulikov
вопрос в том от ччего берется сайз?

Да, поэтому я и сказал про опечатку))

Правда наверное стоит не так писать А типо auto needed_size = v.size() + other.size(); if (v.capacity() < needed_size) { v.reserve(max(needed_size, v.capacity() * 3/2)); } В коде выше есть проблема да...

Arelav
Правда наверное стоит не так писать А типо auto ne...

Вот такой if как раз лишний... Хотя хороший вопрос, как сделать красивее

Dmitriy [Отпуск]
Вот такой if как раз лишний... Хотя хороший вопрос...

Не мы не лишний, так как иначе у нас после итерации size увеличиться и мы опять сделаем reserve

Arelav
Правда наверное стоит не так писать А типо auto ne...

Кажется такой код решает эту задачу? Мы растем только когда нужно, и когда нужно растем либо так чтобы влезла вся следующая итерация, либо на 1.5, если следующая итерация маленькая

точнее, если убрать if - на каждом проходе capacity будет увеличиваться в 1.5 раза

Bulat Ziganshin
точнее, если убрать if - на каждом проходе capacit...

Не, представь size = 10, capacity 10 needed_size = 11 После этой итерации size = 11, capacity = 15 needed_size = 12 После этой итерации size = 12, сapacity = 16

Придумать и реализовать свою стратегию роста можно, но зачем если меня устраивает дефолтная? Все что мне нужно - это возможность разделить push_back на бросающую часть (reserve_next) и не бросающую (push_back с предусловием что size < capacity). Я бы все-таки сказал что главным препятствием для этого предложения является то, что комитет, если мне не изменяет память, поддерживал идею использовать terminate вместо исключений, если закончилась память. Проверить мои слова можно откопав пропозал Саттера про исключения, кажется что там были результаты голосования по этому вопросу.

magras
Придумать и реализовать свою стратегию роста можно...

А как вы хендлите оом от резерва? Я в реальном коде никогда такого не видел, обычно это аборт. Потому что без памяти скорее всего уже не отрекавкриться.

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
1
Святости? Когда дотумкаешь что открытое лучше закрытого - кастани
zamtmn
9
я имею в виду официально интегрированный в телегу? в том плане что не сливает переписку с пользователем?
Andrey
9
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
19
Кто-нибудь решал проблему с автоматическим скроллингом к выбранной ячейке в TDBGrid в Lazarus? Проблема в том, что есть допустим 3 столбца, третий столбец виден наполовину, вк...
Дмитрий Логинов
1
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
ты вот так хотел? а пурджить arg бесполезно это не макрос, вот рестроить arg смысл есть, но в конце области видимости, а не перед началом новой области видимости.
ProMiNick
7
Карта сайта