Вы никогда не должны ожидать, что они превзойдут задания. Причина в том, что компилятор будет использовать memcpy в любом случае, когда он думает, что это будет быстрее (если вы используете флаги оптимизации). Если нет, и если структура достаточно мала, чтобы она вписывалась в регистры, можно использовать прямую манипуляцию с регистром, которая вообще не требует доступа к памяти.
GCC имеет специальные шаблоны перемещения блоков внутри, которые определяют, когда непосредственно изменять регистры / ячейки памяти или когда использовать функцию memcpy. Обратите внимание, что при назначении структуры во время компиляции компилятор знает, насколько большим будет движение, поэтому он может развернуть маленькие копии (например, выполнить перемещение n-раз подряд вместо цикла). Примечание -mno-memcpy
:
-mmemcpy
-mno-memcpy
Force (do not force) the use of "memcpy()" for non-trivial block moves.
The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.
Кто знает, когда лучше использовать memcpy, чем сам компилятор?