С что касается в проблемы копия против memcpy против memmove(отличная информация здесь, кстати.), Я читал, и мне кажется, что В отличие от что в разговорной речи, например, в cppreferenceПримечание: memcpy был изменен на memmove с момента получения этой цитаты. —
Заметки
На практике реализации
std::copy
избегать нескольких назначений
и использовать функции массового копирования, такие какstd::memcpy
если тип значения
TriviallyCopyable
— std::copy
(ни std::copy_backward
) не могу быть реализован с точки зрения memcopy
, потому что для std::copy
только начало диапазона назначения не должен попадать в диапазон источника, но за memcpy
полнота диапазонов не должно пересекаться
Рассматривая реализацию Visual-C ++ (см. xutility
заголовок), мы также можем наблюдать, что VC ++ использует memmove, но вон тот теперь имеет более мягкие требования, чем std::copy
:
… Объекты могут перекрываться: копирование происходит так, как если бы символы
были скопированы во временный массив символов, а затем символы
были скопированы из массива …
Так что казалось бы, что реализация std::copy
с точки зрения memcpy
не возможно, но используя memmove
на самом деле пессимизация. (крошечная пессимизация, возможно, не измеримая, но все же)
Чтобы вернуться к вопросу (ам): Правильно ли мое резюме? Это где-нибудь проблема? Независимо от того, что указано, есть ли вообще возможная практическая реализация memcpy
это также не соответствует требованиям std::copy
то есть memcpy
реализации, которые ломаются, когда диапазоны частично перекрываются как позволено от std::copy
?
Если вопрос в том, возможно ли встретить эффективную реализацию memcpy с достаточным неопределенным поведением, чтобы не доверять ей в перекрывающихся диапазонах, тогда ответ — да. 🙂
Рассмотрим одну из возможных реализаций memcpy on Power (PC): инструкция lmw загрузит несколько последовательных слов из памяти в последовательные регистры (которые могут быть указаны в качестве заданного пользователем аргумента диапазона). Затем stmw сохранит введенный диапазон регистров обратно в память. Таким образом, мы говорим о ~ 100/200 байт (32b / 64b ЦП), буферизованных ЦП во время одной итерации memcpy — много данных, чтобы испортить целевой диапазон, если он перекрывается с исходным, особенно учитывая, что ЦП не дает обещаний об относительном порядке индивидуальной загрузки и магазинов.
Других решений пока нет …