Чтобы ответить на ваш вопрос об имени memmove()
: я думаю, что имя предназначено для отражения поддержки перемещения диапазонов элементов в массиве в другой диапазон в массиве (например, чтобы освободить место для нового элемента вначало или внутри массива).
Как уже упоминалось в других ответах, memcpy()
может использовать методы оптимизации, которые недоступны для memmove()
, поскольку memcpy()
не поддерживает области памяти, которые перекрываются, в то время как memmove()
делает.
Одна вещь, которую вы, возможно, захотите рассмотреть, - это по-прежнему использовать memmove()
вместо memcpy()
по умолчанию, если только вы не работаете с приложением, в котором производительность копирования критична.memcpy()
может обеспечить лучшую производительность (в основном потому, что, я думаю, она может быть встроена более эффективно), но имейте в виду эту цитату о реализации memcpy()
в ядре Linux из обсуждения о неправильном использовании приложенияиз библиотеки memcpy()
:
В ядре оптимизированный x86 memcpy, который мы используем, на самом деле является memmove (), потому что, хотя производительность действительно важна, повторяемость и избегание неожиданностей (строго говоря), у нас есть два: версия "rep movs" для случая, когда это должно быть быстрым, и версия с открытым кодированием. Версия "rep movs" предназначена только для пересылки и не обрабатывает перекрывающиеся области).