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