std::realloc
является опасным в C++, если память malloc'd содержит не-типы. Кажется, только проблема в том, что std::realloc
не вызовет тип деструкторов, если он не может вырастить память на месте.Использование realloc в C++
Тривиальная работа вокруг была бы функцией try_realloc
. Вместо того чтобы malloc'ing новой памяти, если она не может быть выращена in situ, она просто вернет false. В этом случае можно было бы выделить новую память, объекты, скопированные (или перемещенные) в новую память, и, наконец, освобожденную память.
Это кажется чрезвычайно полезным. std::vector
может очень использовать это, возможно, избегая всех копий/перераспределений.
Упреждающее огнезащитное средство: Технически это то же самое, что и у Big-O, но если рост вектора - это горло бутылки в вашем приложении, скорость x2 хороша, даже если Big-O остается неизменным.
НО, я не могу найти какой-либо c api, который работает как try_realloc
.
Я что-то упустил? try_realloc
не так полезен, как я себе представляю? Есть ли скрытая ошибка, которая делает try_realloc
непригодной для использования?
Еще лучше, есть ли менее документированный API, который работает как try_realloc
?
ПРИМЕЧАНИЕ: Я, очевидно, в коде библиотеки/платформы. Я не волнуюсь, так как try_realloc
по своей сути является оптимизацией.
Update: После Стив Jessops комментарий по вопросу о том vector
будет более эффективным использованием перераспределить я написал доказательство концепции для проверки. realloc-vector
имитирует шаблон роста вектора, но имеет возможность повторно использовать вместо него. Я запустил программу до миллиона элементов в векторе.
Для сравнения a vector
должен выделять 19 раз, увеличивая до миллиона элементов.
Результаты, если realloc-vector
- это единственная вещь, использующая кучу, результаты являются удивительными, 3-4 выделения при увеличении до миллиона байт.
Если realloc-vector
используется вместе с vector
, который растет на 66% скорости в realloc-vector
результаты менее многообещающим, выделяя 8-10 раз во время роста.
И наконец, если realloc-vector
используется вместе с vector
, который растет с той же скоростью, realloc-vector
выделяет 17-18 раз. Едва экономя одно распределение над стандартным поведением вектора.
Я не сомневаюсь, что хакер мог распределить размеры игры, чтобы улучшить сбережения, но я согласен со Стивом в том, что огромная работа по написанию и обслуживанию такого распределителя не работает.
Трудно представить конкретные предложения платформы, не представляя платформу, на которую вы хотите настроить таргетинг. –
Моя цель - gcc + Linux. Тем не менее, мне вообще интересно, поэтому будет рассмотрено решение на любой платформе. –
Я не могу не думать: если вы хотите получить лучшую производительность, используйте vector.reserve(), чтобы вам не нужно было вырастить вектор вообще. –