Реализация memmove в C - PullRequest
       31

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

6 голосов
/ 26 августа 2010

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

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

copy from the back

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

Ответы [ 3 ]

30 голосов
/ 26 августа 2010

Математически вам не нужно беспокоиться о том, перекрываются ли они вообще. Если 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 выше для копирования с начала.

6 голосов
/ 26 августа 2010

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

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

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

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

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

2 голосов
/ 26 августа 2010

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

...