cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить не копирующий вариант функции realloc и/или функцию проверки возможности изменения размера блока памяти #354

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +4, -2 Автор идеи: Сергей Мищенко

Суть - в С прекрасно работал realloc который позволял снизить количество копирований при ресайзе буфера. В С++ оно работь будет не с любым типом объектов по причине невозможности копирования некоторых типов объектов через memcpy. Так же автоматическое копирование буфера, в случае необходимости выделения блока в другом месте, не является оптимальной стратегией расширения буфера для вставки в середину. В результате возможность использования realloc сведена практически к нулю. Для нормального использования функционала изменения размера блока, необходимо сделать аналог realloc, позволяющий в случае невозможности расширения буфера, производить копирование и очистку старого буфера вручную, что позволит снизить количество копирований и фрагментацию кучи при ресайзе буферов.

apolukhin commented 3 years ago

yndx-antoshkka, 10 сентября 2018, 11:58 Дубль. Есть аналогичное предложение: #354

Илья, 15 сентября 2018, 21:14 yndx-antoshkka, ваша ссылка ведет на это же предложение. Ссылка через поиск: https://github.com/cpp-ru/ideas/issues?q=is%3Aissue+is%3Aopen+realloc

Илья, 15 сентября 2018, 22:03 yndx-antoshkka, предложение от 5 декабря 2016 зависло, или есть какой-то прогресс?

Сергей Мищенко, необходимо предусмотреть как расширение, так и сужение области выделенной памяти. В том числе вариант должен работать в обе стороны относительно выделенного участка памяти. Итого 4 комбинации.

Если сужение будет работать всегда, то расширение только при наличии свободной памяти до/после выделенного блока памяти.

Если памяти для расширения недостаточно, как функция должна себя вести? Например память довыделить можно, но не столько, сколько запрошено, а меньше. В таком случае решением, вероятно, будет реализовать возможность указывать диапазон, сколько хотим довыделить, и сколько устроит, если сколько хотим довыделить невозможно...

Касательно функции проверки возможности изменения размера блока памяти, возникает следующая проблема - после ее вызова придется гарантировать эту самую возможность. Т.о. функция должна и определять объем довыделяемой памяти и довыделять ее за один вызов.

apolukhin commented 3 years ago

Аналогичное предложение #28