Какой из них использовать - memmove () или memcpy () - когда буферы не перекрываются? - PullRequest
21 голосов
/ 25 декабря 2009

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

Но что, если я точно знаю, что буферы не перекрываются - есть ли причина использовать конкретно memcpy() или конкретно memmove()? Что я должен использовать и почему?

Ответы [ 4 ]

32 голосов
/ 25 декабря 2009

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

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

Чтобы ответить на ваш вопрос: вы должны использовать тот, который является семантически правильным. Если вы можете гарантировать, что буферы не перекрываются, вы должны использовать memcpy. Если вы не можете гарантировать, что буферы не перекрываются, вы должны использовать memmove.

29 голосов
/ 25 декабря 2009

memcpy() не имеет специальной обработки для перекрывающихся буферов, поэтому ему не хватает некоторых проверок, поэтому он быстрее, чем memmove().

Также на некоторых архитектурах memcpy() может выиграть от использования инструкций ЦП для перемещения блоков памяти - то, что memmove() не может использовать.

5 голосов
/ 25 декабря 2009

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

Вполне возможно, хотя и маловероятно, что человек, написавший memmove для вашего конкретного компилятора, был сертифицированным гением, в то время как бедная душа, получившая работу по написанию memcpy, была деревенским идиотом:

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

2 голосов
/ 04 февраля 2016

На некоторой платформе ARM, над которой я работаю, memmove был в 3 раза быстрее чем memcpy для короткой не выровненной загрузки. Поскольку memcpy и memmove являются единственным действительно переносимым механизмом перетаскивания типов, вы могли бы подумать, что компилятор проверит их перед попыткой использовать NEON для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...