Код проверяет, правильно ли выровнены адреса для UINT
. Если это так, код копируется с использованием UINT
объектов. Если нет, код копируется с использованием BYTE
объектов.
Тест работает, сначала выполняя побитовое ИЛИ двух адресов. Любой бит, включенный в любом из адресов, будет включен и в результате. Затем тест выполняет побитовое И с sizeof(UINT) - 1
. Ожидается, что размер UINT
равен степени двойки. Тогда размер минус один включает все младшие биты. Например, если размер равен 4 или 8, то на единицу меньше в двоичном формате 112 или 1112. Если какой-либо из адресов не кратен размеру UINT
, то он будет иметь один из этих битов, и тест укажет на это. (Обычно лучшее выравнивание для целочисленного объекта совпадает с его размером. Это не обязательно верно. Современная реализация этого кода должна использовать _Alignof(UINT) - 1
вместо размера.)
Копирование с объектами UINT
выполняется быстрее, поскольку на аппаратном уровне одна инструкция загрузки или сохранения загружает или сохраняет все байты объекта UINT
(вероятнее всего, четыре байта). Процессоры обычно копируют быстрее при использовании этих инструкций, чем при использовании в четыре раза большего количества однобайтовых инструкций загрузки или сохранения.
Этот код, конечно, зависит от реализации; для этого требуется поддержка реализации C, которая не является частью базового стандарта C, и это зависит от конкретных особенностей процессора, на котором он выполняется.
Более продвинутая реализация memcpy
может содержать дополнительные функции, такие как:
- Если один из адресов выровнен, а другой нет, используйте специальные инструкции загрузки-невыравнивания для загрузки нескольких байтов с одного адреса с обычными инструкциями сохранения по другому адресу.
- Если процессор имеет инструкции Single Instruction Multiple Data, используйте эти инструкции для загрузки или сохранения большого количества байтов (часто 16, а возможно и больше) в одной инструкции.
person
Eric Postpischil
schedule
04.10.2013
memcpy
самостоятельно :-) Однако настоящая красота видна только тогда, когда вы смотрите на сгенерированный машинный код. - person Kerrek SB   schedule 04.10.2013