Использование realloc в c ++

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 раз. Едва сэкономить одно распределение по сравнению со стандартным векторным поведением.

Я не сомневаюсь, что хакер мог бы изменить размеры распределения, чтобы улучшить экономию, но я согласен со Стивом, что огромные усилия по написанию и поддержке такого распределителя не работают выигрыш.

15
задан deft_code 3 November 2010 в 18:44
поделиться