2015-07-28 4 views

ответ

5

Предполагая 32-битную архитектуру, memcpy сводится к одной инструкции mov (или аналогичной). Так оно быстрее. Но это тоже неправильно. С точки зрения C вы вызываете Выполняемая реализация поведение делает это. Что может произойти в действительности, так это то, что ваши байты ошибочно заказываются, в зависимости от того, находитесь ли вы на big endian или маленькая конечная платформа. Поэтому просто используйте решение для смещения битов, вместо того чтобы беспокоиться о производительности.

+0

есть способ заставить endian? Теперь просто любопытно. Редактировать: хорошо, а не по порядку. – Bremen

+0

* endianness * является свойством используемого вами оборудования (например, вашего CPU). так, нет. Однако вы можете проверить это. –

+0

Я имею в виду, что я знаю, что в моей архитектуре немного эндиан. Я просто подумал, что параметр может быть передан для принудительного выполнения определенного порядка. – Bremen

-2

Я думаю, что memcpy будет быстрее, потому что доза не вычисляется, только используйте move. байт shift есть булавка уровень расчет.

+1

Это не полезно. См. Мой ответ. –

2

В современных компиляторах memcpy в C, как правило, гарантированно является самым быстрым способом копирования. Однако это предполагает, что оно правильно включено в вашу реализацию.

Я также не верю, что это вызывает строгие нарушения псевдонимов, поскольку два указателя никогда не имеют одинаковой памяти.

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

Если, с другой стороны, вы хотите немного упорядочивания байтов по порядку, используйте htole32, чтобы гарантировать, что int становится мало ориентированным на любом оборудовании. Однако будьте осторожны, что htole32 является расширением в BSD, Linux и различных других операционных системах и не гарантируется быть доступным для всех реализаций (прочитанных, нестандартных).

+0

+1 для того, чтобы оптимизировать это «безопасным» способом. Но все же отметить, что «htole32» не распространяется на стандарт C. –

+0

@FelixPalmen Правда во второй части, я добавлю предупреждение на ответ. И спасибо. – Vality

+1

Строгое сглаживание не применяется с 'memcpy' /' memmove', потому что байты копии (иначе через 'char *'). Однако для 'memcpy'' 'dst' и' src' не перекрываются. – edmz

Смежные вопросы