реализация memmove в C

Может ли кто-нибудь помочь мне понять, как memmove реализован в C. У меня есть только один специальное условие, верно?

if((src<dst)&&((src+sz) > dst))

copy from the back

Кроме того, это зависит от того, как растет стек?

6
задан brett 26 August 2010 в 05:55
поделиться

2 ответа

memmove можно превратить в memcpy, если две области памяти не перекрываются. Очевидно, что memcpy чрезвычайно оптимизирован для большинства систем (одна из тех, которые я использую, использует почти все приемы в книге, от развернутых циклов до операций SSE, где поддерживается максимальная пропускная способность).

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

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

memmove вообще не зависит от способа роста стека — он просто копирует одну область памяти в другую — точно так же, как memcpy, за исключением того, что он обрабатывает перекрывающиеся области, а memcpy — нет.

РЕДАКТИРОВАТЬ: На самом деле, если подумать об этом еще немного... Работа со спины может работать, если вы идете из правильного "источника" (так сказать), в зависимости от самого движения (например, источник < пункт назначения или нет). ?). Вы можете прочитать реализацию newlib здесь, и она также довольно хорошо прокомментирована.

6
ответ дан 8 December 2019 в 02:23
поделиться

Зависит от компилятора. Хорошие компиляторы будут использовать хорошие оптимизации в зависимости от набора инструкций целевого процессора и ширины шины.

2
ответ дан 8 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: