Использование realloc в clang для сокращения памяти - PullRequest
4 голосов
/ 20 сентября 2011

Я столкнулся с проблемой с нашим кодом в clang, связанной с realloc. Этот код прекрасно работает в gcc и visual studio, поэтому мне интересно понять поведение clang. Наш код делает что-то похожее на это (обработка ошибок и т. Д.):

// allocate way more memory than we need
char * memory = malloc(500000);
int memoryused = 0;

// ... code goes here that fills up the memory, keeping track by
// setting memoryused ...

// now we're done, shrink the memory down to the size it needs
memory = realloc(memory, memoryused);

В gcc и нескольких версиях MSVC указатель памяти не перемещался. Однако в clang кажется, что он перемещает память, даже если необходимый размер составляет всего 1-2000 байт.

Есть ли какая-то особая причина, по которой кланг делает это? Единственное, о чем я могу думать, это то, что, возможно, он хранит отдельные кучи для больших и малых выделений или что-то в этом роде. Иначе кажется немного неэффективным перемещать память, когда она может просто обрезать старый блок памяти и продолжить использовать его, не копируя данные вообще.

1 Ответ

3 голосов
/ 20 сентября 2011

Я однажды задумался и о подобных вещах: Гарантируется ли realloc на месте, когда буфер сжимается?

Подводя итоги ответов - realloc разрешено перемещать буфер, даже когда он просто уменьшается ... Точные детали зависят от конкретной реализации библиотеки.

От c99 (акцент мой):

Функция realloc возвращает указатель на новый объект (который может имеют то же значение, что и указатель на старый объект), или нулевой указатель если новый объект не может быть выделен.

Как вы уже догадались (и согласно некоторым ответам в связанном вопросе) некоторые распределители, по-видимому, делят кучу, так что выделения определенного диапазона размеров происходят из одного и того же сегмента распределения - предотвращение фрагментация кучи в случае, когда вокруг может быть разбросано множество мелких объектов, что остановит выделение больших смежных блоков.

Надеюсь, это поможет.

...