В дополнение к отличному ответу FrankH; Я хотел бы отметить, что какой метод является лучшим, зависит также от длины строки, ее выравнивания и от того, является ли длина фиксированной или переменной.
Для небольших строк (может быть, до 16 байтов) выполнение этого вручную с помощью простых инструкций, вероятно, быстрее, поскольку это позволяет избежать затрат на настройку более сложных методов (а для строк фиксированного размера можно легко развернуть). Для строк среднего размера (возможно, от 16 байт до 4 КиБ) лучше всего подойдет что-то вроде «REP MOVSD» (с некоторыми инструкциями «MOVSB», если возможно смещение).
Для чего-то большего, чем это, некоторые люди будут испытывать желание перейти на SSE / AVX и предварительную выборку, и т. Д. Лучшая идея состоит в том, чтобы исправить вызывающие абоненты так, чтобы копирование (или strlen () или что-то еще) не требовалось на первом месте. Если вы будете стараться изо всех сил, вы почти всегда найдете способ. Примечание: Также будьте очень осторожны с «предполагаемыми» процедурами fast mempcy () - обычно они тестировались на массивных строках и не тестировались на гораздо более вероятных крошечных / маленьких / средних строках.
Также обратите внимание, что (с целью оптимизации, а не удобства) из-за всех этих различий (вероятная длина, выравнивание, фиксированный или переменный размер, тип процессора и т. Д.) Идея иметь один многоцелевой "memcpy ()" для всех очень разных случаев близоруко.