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