Ответ 1
Если вы знаете размер данных, которые нужно скопировать, то memcpy()
должен быть таким же быстрым или быстрым, чем strcpy()
. В противном случае memcpy()
нельзя использовать отдельно, а strcpy()
должен быть таким же быстрым или быстрым, чем strlen()
, за которым следует memcpy()
.
Однако...
Множество реализаций memcpy()
и/или strcpy()
и/или strlen()
предназначены для эффективной обработки больших объемов данных. Это часто означает дополнительные накладные расходы на запуск (например, определение выравнивания, настройка SIMD, управление кешем и т.д.) И делает эти реализации плохими (медленными) для копирования небольших объемов данных (что гораздо более вероятно в хорошо написанном коде). Из-за этого "должно быть так быстро или быстро" не обязательно означает "так же быстро или быстро". Например, для небольших объемов данных memcpy()
, оптимизированный для больших объемов данных, может быть значительно медленнее, чем a strcpy()
, который не оптимизирован для больших объемов данных.
Также обратите внимание, что основная проблема заключается в том, что общий код (например, memcpy()
и strcpy()
) не может быть оптимизирован для конкретного случая. Лучшим решением было бы иметь несколько функций - например, memcpy_small()
, который оптимизирован для копирования небольших объемов данных и memcpy_large()
, оптимизированных для плохого кода, который не позволяет копировать большой объем данных.