memcpy против назначения в C - PullRequest
23 голосов
/ 27 ноября 2008

При каких обстоятельствах я ожидаю, что memcpys превзойдет задания на современном оборудовании INTEL / AMD? Я использую GCC 4.2.x на 32-битной платформе Intel (но меня интересует и 64-битная).

1 Ответ

35 голосов
/ 27 ноября 2008

Вы никогда не должны ожидать, что они превзойдут задания. Причина в том, что компилятор будет использовать 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, чем сам компилятор?

...