Подтвердить что ты не робот

Memcpy vs назначение в C

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

4b9b3361

Ответ 1

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