Являются ли ограничения std :: copy более смягченными, чем std :: memcopy?

С что касается в проблемы копия против 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?

4

Решение

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

Рассмотрим одну из возможных реализаций memcpy on Power (PC): инструкция lmw загрузит несколько последовательных слов из памяти в последовательные регистры (которые могут быть указаны в качестве заданного пользователем аргумента диапазона). Затем stmw сохранит введенный диапазон регистров обратно в память. Таким образом, мы говорим о ~ 100/200 байт (32b / 64b ЦП), буферизованных ЦП во время одной итерации memcpy — много данных, чтобы испортить целевой диапазон, если он перекрывается с исходным, особенно учитывая, что ЦП не дает обещаний об относительном порядке индивидуальной загрузки и магазинов.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]