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