Когда __builtin_memcpy заменяется libc memcpy
В GCC есть версия функции C99/posix memcpy
: __builtin_memcpy
.
Иногда он может быть заменен GCC на встроенную версию memcpy, а в других случаях он заменяется вызовом libc memcpy. Например. было отмечено здесь:
Наконец, в примечании к компилятору __builtin_memcpy может вернуться к выдаче вызова функции memcpy.
Какова логика в этом выборе? Является ли это логичным то же самое в других gcc-совместимых компиляторах, таких как clang/llvm, intel С++ compiler, PCC, suncc (oracle studio)?
Когда я предпочитаю использовать __builtin_memcpy поверх простой memcpy?
Ответы
Ответ 1
Некоторое время назад я экспериментировал со встроенной заменой и обнаружил, что функции <string.h>
заменяются только тогда, когда размер исходного аргумента может быть известен во время компиляции. В этом случае вызов libc
заменяется непосредственно развернутым кодом.
Если вы не компилируете с -fno-builtin
, -ansi
, -std=c89
или чем-то подобным, на самом деле не имеет значения, используете ли вы префикс __builtin_
или нет.
Хотя за этим трудно следовать, код, который решает, следует ли отправлять вызов библиотеки или фрагмент кода, кажется, здесь.