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

Когда __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?

4b9b3361

Ответ 1

Некоторое время назад я экспериментировал со встроенной заменой и обнаружил, что функции <string.h> заменяются только тогда, когда размер исходного аргумента может быть известен во время компиляции. В этом случае вызов libc заменяется непосредственно развернутым кодом.

Если вы не компилируете с -fno-builtin, -ansi, -std=c89 или чем-то подобным, на самом деле не имеет значения, используете ли вы префикс __builtin_ или нет.

Хотя за этим трудно следовать, код, который решает, следует ли отправлять вызов библиотеки или фрагмент кода, кажется, здесь.