memmove можно превратить в memcpy, если две области памяти не перекрываются.Очевидно, что memcpy чрезвычайно оптимизирован на большинстве систем (одна из тех, которые я использую, использует почти все приемы в книге от развернутых циклов до операций SSE, где поддерживается максимальная пропускная способность).
Если две области памяти перекрываютсяДля всех намерений и целей область, которую нужно скопировать, перемещается во временный буфер, и временный буфер копируется (скорее всего, с memcpy) обратно поверх исходного буфера.Вы не можете работать с самого начала или работать сзади с перекрывающейся областью, потому что вы всегда будете в конечном итоге получать по крайней мере некоторые данные, поврежденные в процессе.
При этом, это было долгоС тех пор, как я посмотрел на код libc, возможно, существует оптимизация для memmove и перекрывающихся областей, о которых я еще не думал.
memmove не зависит от того, как будет расти стек -он просто копирует одну область памяти в другое место - точно так же, как memcpy, за исключением того, что он обрабатывает перекрывающиеся области, а memcpy - нет.
РЕДАКТИРОВАТЬ: На самом деле, подумав об этом еще немного ... Работа со спины можетработать, если вы идете от правильного «источника» (так сказать), в зависимости от самого хода (например, источник здесь , и это тоже довольно хорошо прокомментировано.