Вопрос

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top