std::realloc
является опасным в С++, если память malloc'd содержит типы non-pod. Кажется, единственная проблема заключается в том, что std::realloc
не будет называть деструкторы типа, если он не может вырастить память на месте.
Тривиальная работа вокруг будет функцией 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
по своей сути является оптимизацией.
Обновление:
Следуя словам Стива Джессопса о том, будет ли vector
более эффективным с использованием realloc, я написал доказательство концепции для тестирования. realloc-vector
имитирует шаблон роста вектора, но имеет возможность повторно использовать вместо него. Я запустил программу до миллиона элементов в векторе.
Для сравнения a vector
должен выделять 19 раз, увеличиваясь до миллиона элементов.
Результаты, если realloc-vector
- единственная вещь, использующая кучу, результаты являются удивительными, 3-4 выделения при увеличении до миллиона байт.
Если realloc-vector
используется вместе с vector
, который растет на 66%, скорость realloc-vector
Результаты менее перспективны, выделяя 8-10 раз во время роста.
Наконец, если realloc-vector
используется вместе с vector
, который растет с одинаковой скоростью, realloc-vector
выделяет 17-18 раз. Едва экономя одно распределение над стандартным поведением вектора.
Я не сомневаюсь, что хакер мог распределять размеры игры, чтобы улучшить сбережения, но я согласен со Стивом в том, что огромные усилия по написанию и поддержке такого распределителя не работают с усилением.