memmove
похоже на memcpy
, за исключением того, что целевой и исходный массив могут перекрываться.
С memcpy
вы обещаете, что регионы не перекрываются, что позволяет реализации выполнить некоторые дополнительные оптимизации. Так что memcpy
может быть быстрее, чем memmove
.
Функция memmove
принимает целевой аргумент void *
и исходный аргумент const void *
. Это означает, что вы можете вызывать функцию с целевым и исходным аргументом типа массива, поскольку они будут преобразованы в типы указателей. А так как вы можете назначить любые неквалифицированные типы указателей объектов на void *
или const void *
, вам не понадобится приведение при вызове функции.
char src[1024] = {0};
char dst[1024];
memmove(dst, src, sizeof dst);
/* src and dst don't overlap you should choose memcpy instead */
memcpy(dst, src, sizeof dst);
Теперь обычно лучше использовать memcpy
или memmove
, чем кодировать собственную функцию. Например, в glibc, в зависимости от набора команд MCU и размера для копирования, memcpy
может быть заменен компилятором с некоторыми версиями быстрой встроенной сборки memcpy
.