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

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

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

copy from the back

Также это зависит от того, как растет стек?

3 ответа

Решение

Математически вам не нужно беспокоиться о том, перекрываются ли они вообще. Если src меньше чем dstПросто скопируйте с конца. Если src больше, чем dstПросто скопируйте с самого начала.

Если src а также dst равны, просто выходите сразу.

Это потому, что ваши дела являются одним из:

1) <-----s----->                start at end of s
                 <-----d----->

2) <-----s----->                start at end of s
            <-----d----->

3) <-----s----->                no action
   <-----d----->

4)          <-----s----->       start at beginning of s
   <-----d----->

5)               <-----s----->  start at beginning of s
   <-----d----->

Даже если нет совпадений, это все равно будет хорошо работать и упростит ваши условия.

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

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

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

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

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

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

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

Другие вопросы по тегам