Если пункт назначения и источник совпадают, что делает memmove? - PullRequest
5 голосов
/ 01 декабря 2011

Если пункт назначения и источник совпадают, memmove все еще «перемещает» данные (или возвращает напрямую)? Как насчет realloc; Что делать, если новый размер совпадает со старым размером?

Ответы [ 3 ]

2 голосов
/ 01 декабря 2011

Это действительно будет зависеть от реализации.Конечно, было бы неплохо сделать это, но это действительно зависит , какую реализацию вы имеете в виду.

Это сработает в любом случае, но, предположительно, подходящая умная реализация будет проверять перекрывающиеся сегменты(и особенно для случая, когда source == dest) и соответствующим образом с ним справиться.

1 голос
/ 01 декабря 2011

Насколько я знаю, ни один стандарт не дает никаких обещаний о немедленном возвращении в таком случае, поэтому не стоит ожидать такого поведения.

Лучше не передавать неверные указатели в надежде, что они не получат доступ к данным; -)

0 голосов
/ 01 декабря 2011

По крайней мере для realloc неявно предполагается, что условие "нет необходимости в перемещении" существует и является действительным, поскольку перемещение отмечается как особый случай:

Функция realloc () изменяет размер объекта памяти, на который указывает ptr, на размер, указанный в size. Содержимое объекта должно оставаться неизменным вплоть до меньшего из новых и старых размеров. Если для нового размера объекта памяти потребуется перемещение объекта, пространство для предыдущего создания объекта освобождается.

Формулировка "если ... будет" предполагает, что это не всегда так. Конечно, вообще не требуется , чтобы реализация опускала ненужную копию.

Единственное требование для memmove заключается в том, чтобы конечный эффект был таким же, как если бы данные были сначала скопированы во временный буфер, а затем скопированы в конечный пункт назначения. Это ограничение «как если бы» позволяет копировать перекрывающиеся области без повреждения данных (я не знаю, какая реализация действительно копирует во временный буфер).

Итак, одним словом: не указано.

...