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 раз. Едва экономя одно распределение над стандартным поведением вектора.
Я не сомневаюсь, что хакер мог распределять размеры игры, чтобы улучшить сбережения, но я согласен со Стивом в том, что огромные усилия по написанию и поддержке такого распределителя не работают с усилением.