Почему в стандартной библиотеке C нет функции, такой как realloc (), без копирования данных? - PullRequest
3 голосов
/ 14 июля 2011

Например, мне нужна такая функция:

char *dst = (char*)malloc(512);
char *src = (char*)malloc(1024);
...
dst = (char*)realloc(dst, 1024);
memcpy(dst, src, 1024);

Как видите, я просто хочу, чтобы функция realloc () увеличивала размер буфера, но realloc () в библиотеке C может копироватьданные со старого адреса.Так есть ли функция в любой библиотеке, как то, что я хочу?

Ответы [ 3 ]

5 голосов
/ 14 июля 2011

Почему бы просто:

free(dst);
dst = malloc(1024);

Также обратите внимание, что realloc может перемещать блок, а также изменять его размер, поэтому удержание старого указателя, возвращенного предыдущим вызовом malloc, calloc или realloc, может больше не ссылаться на один и тот же блок.

1 голос
/ 14 июля 2011

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

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

0 голосов
/ 14 июля 2011

Так есть ли функция в любой библиотеке, как я хочу?

Нет, нет. Как система может увеличить объем памяти, если в ней нет места?

например. представьте, что вы делаете это:

char *a = malloc(2);
char *b = malloc(2);

Теперь выделенная память может выглядеть следующим образом:

1   2   3   4   5   6   7
-------------------------
|   |   |   |   |   |   |
-------------------------
\      /\       /\      /        
 \    /  \     /  \    /
   v        v        v
 memory   unused/   memory
 for "a"  internal   for "b"
         memory piece

Теперь вы делаете realloc(a,10);. Система не может просто расширить часть памяти для «а». Он попадет в память, используемую "b", поэтому вместо этого он должен найти другое место в памяти, которое имеет 10 смежных свободных байтов, скопировать 2 байта из старого фрагмента памяти и вернуть вам указатель на эти новые 10 байтов .

...