6.61 Другие встроенные функции, предоставляемые GCC
GCC предоставляет большое количество встроенных функций помимо упомянутых выше. Некоторые из них предназначены для внутреннего использования при обработке исключений или списков аргументов переменной длины и не документированы здесь, потому что они могут время от времени изменяться; мы не рекомендуем их общее использование.
Остальные функции предоставляются для целей оптимизации.
За исключением встроенных функций, имеющих библиотечные аналоги, такие как стандартные функции библиотеки C, обсуждаемые ниже, или функций, расширяющихся до вызовов библиотеки, встроенные функции GCC всегда расширяются встраиваемо и, следовательно, не имеют соответствующих точек входа, и их адрес нельзя получить. Попытка использовать их в выражении, отличном от вызова функции, приводит к ошибке во время компиляции.
GCC включает встроенные версии многих функций стандартной библиотеки C. Эти функции представлены в двух формах: одна, имена которых начинаются с префикса __builtin_, и другая — без него. Обе формы имеют одинаковый тип (включая прототип), один и тот же адрес (при взятии их адреса) и один и тот же смысл, что и функции библиотеки C, даже если вы укажете опцию -fno-builtin, см. Параметры, контролирующие диалект C.
В режиме, отличном от строгого ISO C (-ansi, -std=c90, -std=c99 или -std=c11), функции _exit, alloca, bcmp, bzero, dcgettext, dgettext, dremf, dreml, drem, exp10f, exp10l, exp10, ffsll, ffsl, ffs, fprintf_unlocked, fputs_unlocked, gammaf, gammal, gamma, gammaf_r, gammal_r, gamma_r, gettext, index, isascii, j0f, j0l, j0, j1f, j1l, j1, jnf, jnl, jn, lgammaf_r, lgammal_r, lgamma_r, mempcpy, pow10f, pow10l, pow10, printf_unlocked, rindex, roundeven, roundevenf, roundevenl, scalbf, scalbl, scalb, signbit, signbitf, signbitl, signbitd32, signbitd64, signbitd128, significandf, significandl, significand, sincosf, sincosl, sincos, stpcpy, stpncpy, strcasecmp, strdup, strfmon, strncasecmp, strndup, strnlen, toascii, y0f, y0l, y0, y1f, y1l, y1, ynf, ynl и yn могут обрабатываться как встроенные функции. Все эти функции имеют соответствующие версии с префиксом __builtin_, которые можно использовать даже в строгом режиме C90.
Функции ISO C99 _Exit, acoshf, acoshl, acosh, asinhf, asinhl, asinh, atanhf, atanhl, atanh, cabsf, cabsl, cabs, cacosf, cacoshf, cacoshl, cacosh, cacosl, cacos, cargf, cargl, carg, casinf, casinhf, casinhl, casinh, casinl, casin, catanf, catanhf, catanhl, catanh, catanl, catan, cbrtf, cbrtl, cbrt, ccosf, ccoshf, ccoshl, ccosh, ccosl, ccos, cexpf, cexpl, cexp, cimagf, cimagl, cimag, clogf, clogl, clog, conjf, conjl, conj, copysignf, copysignl, copysign, cpowf, cpowl, cpow, cprojf, cprojl, cproj, crealf, creall, creal, csinf, csinhf, csinhl, csinh, csinl, csin, csqrtf, csqrtl, csqrt, ctanf, ctanhf, ctanhl, ctanh, ctanl, ctan, erfcf, erfcl, erfc, erff, erfl, erf, exp2f, exp2l, exp2, expm1f, expm1l, expm1, fdimf, fdiml, fdim, fmaf, fmal, fmaxf, fmaxl, fmax, fma, fminf, fminl, fmin, hypotf, hypotl, hypot, ilogbf, ilogbl, ilogb, imaxabs, isblank, iswblank, lgammaf, lgammal, lgamma, llabs, llrintf, llrintl, llrint, llroundf, llroundl, llround, log1pf, log1pl, log1p, log2f, log2l, log2, logbf, logbl, logb, lrintf, lrintl, lrint, lroundf, lroundl, lround, nearbyintf, nearbyintl, nearbyint, nextafterf, nextafterl, nextafter, nexttowardf, nexttowardl, nexttoward, remainderf, remainderl, remainder, remquof, remquol, remquo, rintf, rintl, rint, roundf, roundl, round, scalblnf, scalblnl, scalbln, scalbnf, scalbnl, scalbn, snprintf, tgammaf, tgammal, tgamma, truncf, truncl, trunc, vfscanf, vscanf, vsnprintf обрабатываются как встроенные функции, за исключением строгого режима ISO C90 (-ansi или -std=c90).
Также существуют встроенные версии функций ISO C99 acosf, acosl, asinf, asinl, atan2f, atan2l, atanf, atanl, ceilf, ceill, cosf, coshf, coshl, cosl, expf, expl, fabsf, fabsl, floorf, floorl, fmodf, fmodl, frexpf, frexpl, ldexpf, ldexpl, log10f, log10l, logf, logl, modfl, modff, powf, powl, sinf, sinhf, sinhl, sinl, sqrtf, sqrtl, tanf, tanhf, tanhl и tanl, которые распознаются в любом режиме, так как ISO C90 оставляет эти имена для целей, которым их использует ISO C99. Все эти функции имеют соответствующие версии с префиксом __builtin_.
Также существуют встроенные функции __builtin_fabsfn, __builtin_fabsfnx, __builtin_copysignfn и __builtin_copysignfnx, соответствующие функциям TS 18661-3 fabsfn, fabsfnx, copysignfn и copysignfnx, для поддерживаемых типов _Floatn и _Floatnx.
Также существуют функции расширения GNU clog10, clog10f и clog10l, имена которых зарезервированы ISO C99 для будущего использования. Все эти функции имеют версии с префиксом __builtin_.
Функции ISO C94 iswalnum, iswalpha, iswcntrl, iswdigit, iswgraph, iswlower, iswprint, iswpunct, iswspace, iswupper, iswxdigit, towlower и towupper обрабатываются как встроенные функции, за исключением строгого режима ISO C90 (-ansi или -std=c90).
Функции ISO C90 abort, abs, acos, asin, atan2, atan, calloc, ceil, cosh, cos, exit, exp, fabs, floor, fmod, fprintf, fputs, free, frexp, fscanf, isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit, tolower, toupper, labs, ldexp, log10, log, malloc, memchr, memcmp, memcpy, memset, modf, pow, printf, putchar, puts, realloc, scanf, sinh, sin, snprintf, sprintf, sqrt, sscanf, strcat, strchr, strcmp, strcpy, strcspn, strlen, strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, tanh, tan, vfprintf, vprintf и vsprintf считаются встроенными функциями, если не указан параметр -fno-builtin (или -fno-builtin-function для отдельных функций). Все эти функции имеют соответствующие версии с префиксом __builtin_.
GCC предоставляет встроенные версии макросов сравнения чисел с плавающей точкой ISO C99, которые не генерируют исключения для неупорядоченных операндов. Они имеют те же имена, что и стандартные макросы ( isgreater, isgreaterequal, isless, islessequal, islessgreater, и isunordered), с префиксом __builtin_. Мы предполагаем, что реализатор библиотеки сможет просто заменить каждый стандартный макрос на его встроенный эквивалент. Аналогичным образом, GCC предоставляет встроенные функции fpclassify, iseqsig, isfinite, isinf_sign, isnormal и signbit, используемые с префиксом __builtin_. Встроенные функции isinf и isnan представлены как с, так и без префикса __builtin_. С опцией -ffinite-math-only встроенные функции isinf и isnan всегда возвращают 0.
GCC предоставляет встроенные версии функций ISO C99 для обработки округления и исключений чисел с плавающей точкой fegetround, feclearexcept и feraiseexcept. Они могут быть недоступны для всех целей, и из-за необходимости тесного взаимодействия с внутренними значениями libc, они могут быть недоступны для всех целевых библиотек libc, но в любом случае они будут плавно переключаться на вызовы libc.
-
Встроенная функция:
void *__builtin_alloca(size_t size) -
Функция
__builtin_allocaдолжна вызываться в области блока. Функция выделяет на стеке вызывающей функции объект размером size байт. Объект выравнивается на границе выравнивания стека по умолчанию для целевой системы, определяемой макросом__BIGGEST_ALIGNMENT__. Функция__builtin_allocaвозвращает указатель на первый байт выделенного объекта. Жизненный цикл выделенного объекта заканчивается непосредственно перед тем, как вызывающая функция вернется своему вызывающему. Это так даже когда__builtin_allocaвызывается внутри вложенного блока.Например, следующая функция выделяет на стеке восемь объектов по
nбайт каждый, сохраняя указатель на каждый из них в последовательных элементах массиваa. Затем она передает массив функцииg, которая может безопасно использовать хранилище, на которое указывает каждый из элементов массива.void f (unsigned n) { void *a [8]; for (int i = 0; i != 8; ++i) a [i] = __builtin_alloca (n); g (a, n); // safe }Поскольку функция
__builtin_allocaне проверяет свой аргумент, вызывающая функция отвечает за обеспечение того, чтобы аргумент не привел к превышению размера стека. Функция__builtin_allocaпредоставляется для возможности выделения на стеке массивов байтов с верхним пределом, который может быть вычислен во время выполнения. Поскольку переменные массивы длины C99 предлагают аналогичную функциональность через портативный, более удобный и безопасный интерфейс, они рекомендуются вместо них в программах C99 и C++, где GCC предоставляет их как расширение. См. Переменные массивы длины для получения подробностей.
-
Встроенная функция:
void *__builtin_alloca_with_align(size_t size, size_t alignment) -
Функция
__builtin_alloca_with_alignдолжна вызываться в области блока. Функция выделяет на стеке вызывающей функции объект размером size байт. Выделенный объект выравнивается на границу, указанную аргументом alignment, единица которого задана в битах (а не байтах). Аргумент size должен быть положительным и не превышать предел размера стека. Аргумент alignment должен быть константным целочисленным выражением, равным степени двойки, большему или равномуCHAR_BITи меньшему некоторому неопределенному максимуму. Вызовы с другими значениями отклоняются с сообщением об ошибке, указывающим допустимые границы. Функция возвращает указатель на первый байт выделенного объекта. Жизненный цикл выделенного объекта заканчивается в конце блока, в котором была вызвана функция. Выделенная память освобождается не позднее, чем непосредственно перед возвратом вызывающей функции своему вызывающему, но может быть освобождена в конце блока, в котором была вызвана функция.Например, в следующей функции вызов
gнебезопасен, потому что когдаoveralignне равно нулю, пространство, выделенное__builtin_alloca_with_align, может быть освобождено в конце оператораif, в котором оно было вызвано.void f (unsigned n, bool overalign) { void *p; if (overalign) p = __builtin_alloca_with_align (n, 64 /* bits */); else p = __builtin_alloc (n); g (p, n); // unsafe }Поскольку функция
__builtin_alloca_with_alignне проверяет свой аргумент size, вызывающая функция отвечает за обеспечение того, чтобы аргумент не привел к превышению размера стека. Функция__builtin_alloca_with_alignпредоставляется для возможности выделения на стеке массивов байтов с произвольным выравниванием, верхняя граница которых может быть вычислена во время выполнения. Поскольку переменные массивы длины C99 предлагают ту же функциональность через портативный, более удобный и безопасный интерфейс, они рекомендуются вместо них в программах C99 и C++, где GCC предоставляет их как расширение. См. Переменные массивы длины для получения подробностей.
-
Встроенная функция:
void *__builtin_alloca_with_align_and_max(size_t size, size_t alignment, size_t max_size) -
Аналогично
__builtin_alloca_with_align, но принимает дополнительный аргумент, определяющий верхнюю границу для size в том случае, если его значение не может быть вычислено во время компиляции, для использования с -fstack-usage, -Wstack-usage и -Walloca-larger-than. max_size должен быть константным целочисленным выражением, оно не влияет на генерацию кода и не предпринимаются попытки проверить его совместимость с size.
-
Встроенная функция:
bool__builtin_has_attribute(type-or-expression, attribute) -
Функция
__builtin_has_attributeвозвращает целочисленное константное выражение, равноеtrue, если символ или тип, на который ссылается аргумент type-or-expression, объявлен с атрибутом, указанным во втором аргументе. Для аргумента type-or-expression, не ссылающегося на символ, поскольку атрибуты не применяются к выражениям, встроенная функция рассматривает тип аргумента. Ни один из аргументов не вычисляется. Аргумент type-or-expression подчиняется тем же ограничениям, что и аргумент функцииtypeof(см. Ссылка на тип сtypeof). Аргумент attribute — это имя атрибута, за которым необязательно следует список аргументов, разделенных запятыми, заключенных в скобки. Признаются оба варианта имен атрибутов — с двойными ведущими и завершающими подчёркиваниями и без них. Подробнее см. Синтаксис атрибутов. Если для атрибута, ожидающего один или несколько аргументов, не указаны аргументы, функция возвращаетtrue, если type-or-expression объявлен с этим атрибутом независимо от значений аргументов атрибута. Указанные для атрибута аргументы, ожидающие некоторые, проверяются и сопоставляются с указанным количеством. Функция возвращаетtrue, если все предоставленные аргументы совпадают. Например, первый вызов функции ниже возвращаетtrue, потому чтоxобъявлен с атрибутомaligned, но второй вызов возвращаетfalse, потому чтоxобъявлен сaligned (8), а не сaligned (4).__attribute__ ((aligned (8))) int x; _Static_assert (__builtin_has_attribute (x, aligned), "aligned"); _Static_assert (!__builtin_has_attribute (x, aligned (4)), "aligned (4)");
Из-за ограничения функция
__builtin_has_attributeвозвращаетfalseдля атрибутаmode, даже если тип или переменная, на которую ссылается аргумент type-or-expression, были объявлены с ним. Функция также не поддерживается с метками и в C с перечислениями.Обратите внимание, что в отличие от препроцессорного оператора
__has_attribute, подходящего для использования в директивах препроцессинга#if,__builtin_has_attribute— это встроенная функция, которая не распознается в таких контекстах.
-
Встроенная функция:
type__builtin_speculation_safe_value(type val, type failval) -
Эта встроенная функция может использоваться для снижения риска небезопасного спекулятивного выполнения. type может быть любым целочисленным типом или любым указателем.
- Если процессор не выполняет код спекулятивно, то возвращается val.
- Если процессор выполняет код спекулятивно, то либо:
- Функция может приостановить выполнение, пока не будет известно, что код больше не выполняется спекулятивно (в этом случае можно вернуть val, как и выше); или
- Функция может использовать зависящее от целевой платформы состояние отслеживания спекуляций, чтобы вернуть failval, когда известно, что спекулятивное выполнение неправильно предсказало операцию условного перехода.
Второй аргумент failval является необязательным и по умолчанию равен нулю, если опущен.
GCC определяет препроцессорную макрос
__HAVE_BUILTIN_SPECULATION_SAFE_VALUEдля целей, которые были обновлены для поддержки этой встроенной функции.Встроенная функция может использоваться в случаях, когда переменная используется, как кажется, безопасно, но процессор из-за спекулятивного выполнения может временно игнорировать проверки границ. Рассмотрим, например, следующую функцию:
int array[500]; int f (unsigned untrusted_index) { if (untrusted_index < 500) return array[untrusted_index]; return 0; }Если функция вызывается многократно со значением
untrusted_indexменьше предела 500, то предсказатель ветвлений узнает, что блок кода, возвращающий значение, хранящееся вarray, будет выполняться. Если функция впоследствии вызывается с значением, выходящим за пределы диапазона, она по-прежнему будет пытаться выполнить этот блок кода в первую очередь, пока процессор не определит, что прогноз был неверен (в этот момент процессор размотает любые неправильные операции). Однако в зависимости от того, как используется результат функции, возможно, останутся следы в кэше, которые могут раскрыть, что хранилось в расположении за пределами границ. Встроенная функция может обеспечить некоторую защиту от утечки данных таким образом, изменив код на:int array[500]; int f (unsigned untrusted_index) { if (untrusted_index < 500) return array[__builtin_speculation_safe_value (untrusted_index)]; return 0; }Встроенная функция либо приостановит выполнение, пока условный переход не будет полностью разрешен, либо может разрешить спекулятивное выполнение продолжить, но использовать 0 вместо
untrusted_value, если это превышает предел.Если доступ к любой области памяти потенциально небезопасен при неправильном спекулятивном выполнении, код можно переписать как
int array[500]; int f (unsigned untrusted_index) { if (untrusted_index < 500) return *__builtin_speculation_safe_value (&array[untrusted_index], NULL); return 0; }что приведет к использованию указателя
NULLв случае небезопасности.
-
Встроенная функция:
int__builtin_types_compatible_p(type1, type2) -
Вы можете использовать встроенную функцию
__builtin_types_compatible_pдля определения, совпадают ли два типа.Эта встроенная функция возвращает 1, если неквалифицированные версии типов type1 и type2 (которые являются типами, а не выражениями) совместимы, и 0 в противном случае. Результат этой встроенной функции может использоваться в целочисленных константных выражениях.
Эта встроенная функция игнорирует квалификаторы верхнего уровня (например,
const,volatile). Например,intэквивалентноconst int.Тип
int[]иint[5]совместимы. С другой стороны,intиchar *несовместимы, даже если размер их типов на конкретной архитектуре одинаков. Кроме того, учитывается количество косвенных указателей при определении сходства. Следовательно,short *не подобенshort **. Кроме того, два типа, объявленные как typedef, считаются совместимыми, если их базовые типы совместимы.Тип
enumне считается совместимым с типомenumдаже если оба совместимы с тем же целочисленным типом; именно это и определяет стандарт C. Например,enum {foo, bar}не подобноenum {hot, dog}.Обычно эту функцию используют в коде, выполнение которого зависит от типов аргументов. Например:
#define foo(x) \ ({ \ typeof (x) tmp = (x); \ if (__builtin_types_compatible_p (typeof (x), long double)) \ tmp = foo_long_double (tmp); \ else if (__builtin_types_compatible_p (typeof (x), double)) \ tmp = foo_double (tmp); \ else if (__builtin_types_compatible_p (typeof (x), float)) \ tmp = foo_float (tmp); \ else \ abort (); \ tmp; \ })Примечание: Этот конструкт доступен только для C.
-
Встроенная функция:
type__builtin_call_with_static_chain(call_exp, pointer_exp) -
Выражение call_exp должно быть вызовом функции, а выражение pointer_exp — указателем. pointer_exp передается в вызов функции в местоположении статической цепочки целевой платформы. Результат встроенной функции — результат вызова функции.
Примечание: Эта встроенная функция доступна только для C. Эта встроенная функция может использоваться для вызова замыканий Go из C.
-
Встроенная функция:
type__builtin_choose_expr(const_exp, exp1, exp2) -
Вы можете использовать встроенную функцию
__builtin_choose_exprдля оценки кода в зависимости от значения константного выражения. Эта встроенная функция возвращает exp1, если const_exp, которое является целочисленным константным выражением, отлично от нуля. В противном случае возвращается exp2.Эта встроенная функция аналогична оператору ‘? :’ в C, за исключением того, что тип возвращаемого выражения не изменяется правилами преобразования. Кроме того, встроенная функция не вычисляет выражение, которое не выбрано. Например, если const_exp оценивается как
true, exp2 не оценивается, даже если оно имеет побочные эффекты.Эта встроенная функция может вернуть lvalue, если выбранный аргумент — lvalue.
Если возвращается exp1, тип возврата такой же, как тип exp1. Аналогично, если возвращается exp2, его тип возврата такой же, как тип exp2.
Пример:
#define foo(x) \ __builtin_choose_expr ( \ __builtin_types_compatible_p (typeof (x), double), \ foo_double (x), \ __builtin_choose_expr ( \ __builtin_types_compatible_p (typeof (x), float), \ foo_float (x), \ /* The void expression results in a compile-time error \ when assigning the result to something. */ \ (void)0))Примечание: Этот конструкт доступен только для C. Кроме того, неиспользуемое выражение (exp1 или exp2, в зависимости от значения const_exp) может все равно генерировать синтаксические ошибки. Это может измениться в будущих версиях.
-
Встроенная функция:
type__builtin_tgmath(functions, arguments) -
Встроенная функция
__builtin_tgmath, доступная только для C и Objective-C, вызывает функцию, определяемую согласно правилам<tgmath.h>макросов. Она предназначена для использования в реализациях данного заголовочного файла, чтобы расширения макросов из этого заголовочного файла расширяли каждый из своих аргументов только один раз, чтобы избежать проблем, когда вызовы таких макросов вложены внутри аргументов других вызовов таких макросов; кроме того, это приводит к лучшей диагностике для некорректных вызовов<tgmath.h>макросов, чем реализации, использующие другие функции языка GNU C. Например,powтип-обобщающий макрос может быть определён как:#define pow(a, b) __builtin_tgmath (powf, pow, powl, \ cpowf, cpow, cpowl, a, b)Аргументами
__builtin_tgmathявляются по меньшей мере два указателя на функции, за которыми следуют аргументы тип-обобщающего макроса (которые будут переданы в качестве аргументов выбранной функции). Все указатели на функции должны быть указателями на типизированные функции, ни одна из которых не может иметь переменное число аргументов, и все они должны иметь одинаковое количество параметров; количество параметров первой функции определяет, сколько аргументов__builtin_tgmathинтерпретируются как указатели на функции, а сколько как аргументы вызываемой функции.Типы указанных функций должны быть все разные, но взаимосвязаны так же, как набор функций, между которыми может выбирать макрос в
<tgmath.h>. Это означает, что функции параметризованы типом с плавающей точкой t, различным для каждой такой функции. Типы возвращаемых значений функций могут быть одинаковыми, или они могут быть типом t для каждой функции, или они могут быть вещественным типом, соответствующим t для каждой функции (если некоторые из типов t являются комплексными). Аналогично, для каждой позиции параметра тип параметра в этой позиции может всегда быть одним и тем же типом, или может быть типом t для каждой функции (этот случай должен применяться по крайней мере для одной позиции параметра), или может быть вещественным типом, соответствующим t для каждой функции.Используются стандартные правила для
<tgmath.h>макросов, чтобы найти общий тип u из типов аргументов для параметров, типы которых различаются между функциями; комплексные целочисленные типы (расширение GNU) обрабатываются как комплексный тип, соответствующий вещественному типу с плавающей точкой, который был бы выбран для соответствующего вещественного целочисленного типа. Если типы возвращаемых значений функций изменяются или все являются одинаковым целочисленным типом, вызывается функция, для которой t есть u, и это ошибка, если такой функции нет. Если типы возвращаемых значений функций являются одним и тем же типом с плавающей точкой, предполагается, что тип-обобщающий макрос — это один из тех из TS 18661, который округляет результат до более узкого типа; если есть функция, для которой t есть u, она вызывается, а в противном случае вызывается первая функция, если таковая имеется, для которой t имеет по крайней мере тот же диапазон и точность, что и u, и это ошибка, если такой функции нет.
-
Встроенная функция:
int__builtin_constant_p(exp) -
Вы можете использовать встроенную функцию
__builtin_constant_pдля определения, известно ли выражение exp константой во время компиляции, и поэтому GCC может выполнить свёртку констант для выражений, включающих это значение. Аргументом функции является выражение, подлежащее проверке. Выражение не вычисляется, побочные эффекты игнорируются. Функция возвращает целое число 1, если аргумент является константой во время компиляции, и 0, если это не известно. Любое выражение, имеющее побочные эффекты, заставляет функцию возвращать 0. Возврат 0 не указывает на то, что выражение является не константой, а лишь то, что GCC не может доказать, что это константа в рамках ограничений активного набора параметров оптимизации.Обычно вы используете эту функцию в встроенном приложении, где память является критическим ресурсом. Если у вас есть сложное вычисление, вы можете захотеть, чтобы оно было свёрнуто, если оно включает константы, но вам нужно вызвать функцию, если это не так. Например:
#define Scale_Value(X) \ (__builtin_constant_p (X) \ ? ((X) * SCALE + OFFSET) : Scale (X))
Вы можете использовать эту встроенную функцию как в макросе, так и во встроенной функции. Однако, если вы используете её во встроенной функции и передаёте аргумент функции в качестве аргумента встроенной функции, GCC никогда не возвращает 1, когда вы вызываете встроенную функцию со строковой константой или составной литеральной (см. Составные литералы) и не возвращает 1, когда вы передаёте числовое значение константы во встроенную функцию, если вы не укажете опцию -O.
Вы также можете использовать
__builtin_constant_pв инициализаторах для статических данных. Например, вы можете написатьstatic const int table[] = { __builtin_constant_p (EXPRESSION) ? (EXPRESSION) : -1, /* … */ };Это допустимый инициализатор, даже если EXPRESSION не является константным выражением, включая случай, когда
__builtin_constant_pвозвращает 1, потому что EXPRESSION может быть свёрнут до константы, но EXPRESSION содержит операнды, которые в противном случае не допускаются в статическом инициализаторе (например,0 && foo ()). GCC должен быть более консервативным при вычислении встроенной функции в этом случае, потому что у него нет возможности выполнить оптимизацию.
-
Встроенная функция:
bool__builtin_is_constant_evaluated(void) -
Функция
__builtin_is_constant_evaluatedдоступна только в C++. Встроенная функция предназначена для использования реализациямиstd::is_constant_evaluatedфункции C++. Программы должны использовать последнюю функцию, а не вызывать непосредственно встроенную.Основное применение встроенной функции заключается в определении того, вызывается ли
constexprфункция вconstexprконтексте. Вызов функции оценивается как явная константная выражение со значениемtrueтогда и только тогда, когда он встречается в вычислении выражения или преобразования, которое явно является константным, как определено в стандарте C++. К контекстам явной константной оценки относятся константные выражения, условияconstexpr ifинструкций, выражения ограничений и инициализаторы переменных, используемых в константных выражениях. Для получения более подробной информации см. последнюю редакцию стандарта C++.
-
Встроенная функция:
void__builtin_clear_padding(ptr) -
Встроенная функция
__builtin_clear_paddingочищает биты заполнения внутри представления объекта, на который указывает ptr, который должен быть указателем. Представление значения объекта не изменяется. Тип объекта предполагается как тип, на который указывает указатель. Внутри объединения очищаются только биты, которые являются битами заполнения для всех членов объединения.Эта встроенная функция полезна, если биты заполнения объекта могут иметь неопределённые значения, и представление объекта должно быть сравниваться по битам с другим объектом, например, для атомных операций.
Для C++, тип аргумента ptr должен быть указателем на тип, который тривиально копируется, за исключением случаев, когда аргументом является адрес переменной или параметра, так как в противном случае неизвестно, не является ли тип просто базовым классом, чьи биты заполнения используются повторно или располагаются по-разному в производном классе.
-
Встроенная функция:
type__builtin_bit_cast(type, arg) -
Функция
__builtin_bit_castдоступна только в C++. Встроенная функция предназначена для использования в реализацияхstd::bit_castшаблонной функции C++. Программы должны использовать последнюю функцию, а не вызывать встроенную функцию напрямую.Эта встроенная функция позволяет переинтерпретировать биты аргумента arg так, как если бы он имел тип type. type и тип аргумента arg должны быть тривиально копируемыми типами с одинаковым размером. При явной константной оценке выполняется дополнительная диагностика, необходимая для
std::bit_cast, и возвращается константное выражение, если arg — константное выражение. Для получения более подробной информации см. последнюю редакцию стандарта C++.
-
Встроенная функция:
long__builtin_expect(long exp, long c) -
Вы можете использовать
__builtin_expectдля предоставления компилятору информации о прогнозировании ветвления. В общем случае вы должны отдавать предпочтение фактической обратной связи профиля для этого (-fprofile-arcs), так как программисты печально известны плохим предсказанием того, как на самом деле выполняется их программа. Однако существуют приложения, в которых сбор этих данных затруднен.Значение возврата — это значение exp, которое должно быть целочисленным выражением. Семантика встроенной функции заключается в том, что ожидается, что exp == c. Например:
if (__builtin_expect (x, 0)) foo ();
указывает, что мы не ожидаем вызова
foo, так как мы ожидаем, чтоxбудет равно нулю. Поскольку вы ограничены целочисленными выражениями для exp, вам следует использовать конструкции, такие какif (__builtin_expect (ptr != NULL, 1)) foo (*ptr);
при проверке указателей или значений с плавающей точкой.
Для целей оптимизации прогнозирования ветвлений вероятность того, что
__builtin_expectвыражение равноtrue, регулируется параметромbuiltin-expect-probabilityGCC, который по умолчанию равен 90%.Вы также можете использовать
__builtin_expect_with_probabilityдля явного присвоения значения вероятности отдельным выражениям. Если встроенная функция используется в конструкции цикла, предоставленная вероятность повлияет на ожидаемое число итераций, производимых оптимизацией цикла.
-
Встроенная функция:
long__builtin_expect_with_probability -
(long exp, long c, double probability)
Эта функция имеет те же семантику, что и
__builtin_expect, но вызывающая сторона предоставляет ожидаемую вероятность того, что exp == c. Последний аргумент, probability, — это значение с плавающей запятой в диапазоне от 0,0 до 1,0 включительно. Аргумент probability должен быть константным выражением с плавающей запятой.
-
Встроенная функция:
void__builtin_trap(void) Эта функция вызывает аномальное завершение программы. GCC реализует эту функцию, используя зависящий от целевой платформы механизм (например, преднамеренное выполнение незаконной инструкции) или вызывая
abort. Используемый механизм может меняться между версиями, поэтому вы не должны полагаться на какую-либо конкретную реализацию.
-
Встроенная функция:
void__builtin_unreachable(void) -
Если поток управления достигает точки
__builtin_unreachable, поведение программы не определено. Это полезно в ситуациях, когда компилятор не может вывести недостижимость кода.Один из таких случаев — сразу после оператора
asm, который либо никогда не завершается, либо перенаправляет управление в другое место и никогда не возвращается. В этом примере, без__builtin_unreachable, GCC выдает предупреждение о том, что управление достигает конца функции, не возвращающей значение. Он также генерирует код для возврата послеasm.int f (int c, int v) { if (c) { return v; } else { asm("jmp error_handler"); __builtin_unreachable (); } }Поскольку оператор
asmбезусловно перенаправляет управление за пределы функции, управление никогда не достигает конца тела функции.__builtin_unreachableфактически недостижима и сообщает об этом компилятору.Другое применение
__builtin_unreachable— это следование за вызовом функции, которая никогда не возвращается, но не объявлена__attribute__((noreturn)), как в этом примере:void function_that_never_returns (void); int g (int c) { if (c) { return 1; } else { function_that_never_returns (); __builtin_unreachable (); } }
-
Встроенная функция:
type__builtin_assoc_barrier(type expr) -
Эта встроенная функция препятствует повторной ассоциации выражения с плавающей запятой expr с выражениями, использующими возвращаемое значение встроенной функции. Само выражение expr может быть переупорядочено, и все выражение expr может быть переупорядочено с операндами после барьера. Барьер актуален только при
-fassociative-math, так как в противном случае арифметика с плавающей запятой не рассматривается как ассоциативная.float x0 = a + b - b; float x1 = __builtin_assoc_barrier(a + b) - b;
означает, что с
-fassociative-math,x0может быть оптимизировано доx0 = a, ноx1не может.
-
Встроенная функция:
void *__builtin_assume_aligned(const void *exp, size_t align, ...) -
Эта функция возвращает свой первый аргумент и позволяет компилятору предположить, что возвращаемый указатель выровнен по крайней мере на align байт. Эта встроенная функция может иметь два или три аргумента; если три, третий аргумент должен иметь целочисленный тип, и если он не равен нулю, это означает смещение при неправильном выравнивании. Например:
void *x = __builtin_assume_aligned (arg, 16);
означает, что компилятор может предположить, что
x, установленное вarg, выровнено по крайней мере на 16 байт, в то время как:void *x = __builtin_assume_aligned (arg, 32, 8);
означает, что компилятор может предположить для
x, установленного вarg, что(char *) x - 8выровнено на 32 байта.
-
Встроенная функция:
int__builtin_LINE() Эта функция эквивалентна макросу препроцессора
__LINE__и возвращает константное целочисленное выражение, значение которого равно номеру строки вызова встроенной функции. При использовании в качестве аргумента по умолчанию C++ для функции F она возвращает номер строки вызова F.
-
Встроенная функция:
const char *__builtin_FUNCTION() Эта функция эквивалентна символу
__FUNCTION__и возвращает константный адрес, указывающий на имя функции, из которой был вызван встроенный элемент, или пустую строку, если вызов не происходит из области функции. При использовании в качестве аргумента по умолчанию C++ для функции F она возвращает имя вызывающей стороны F или пустую строку, если вызов не происходил из области функции.
-
Встроенная функция:
const char *__builtin_FILE() -
Эта функция эквивалентна макросу препроцессора
__FILE__и возвращает константный адрес, указывающий на имя файла, содержащего вызов встроенной функции, или пустую строку, если вызов не происходит из области функции. При использовании в качестве аргумента по умолчанию C++ для функции F она возвращает имя файла вызова F или пустую строку, если вызов не происходил из области функции.Например, в следующем примере каждый вызов функции
fooвыведет строку, подобную"file.c:123: foo: message", с именем файла и номером строки вызоваprintf, именем функцииfoo, за которым следует словоmessage.const char* function (const char *func = __builtin_FUNCTION ()) { return func; } void foo (void) { printf ("%s:%i: %s: message\n", file (), line (), function ()); }
-
Встроенная функция:
void__builtin___clear_cache(void *begin, void *end) -
Эта функция используется для очистки кэша инструкций процессора для области памяти между begin (включительно) и end (исключительно). Для некоторых платформ необходимо очистить кэш инструкций после изменения памяти, содержащей код, чтобы получить детерминированное поведение.
Если для целевой платформы очистка кэша инструкций не требуется,
__builtin___clear_cacheне имеет эффекта. В противном случае либо генерируются инструкции для очистки кэша инструкций, либо вызывается функция__clear_cacheиз libgcc.
-
Встроенная функция:
void__builtin_prefetch(const void *addr, ...) -
Эта функция используется для минимизации задержки промаха кэша, перемещая данные в кэш перед доступом к ним. Вы можете вставлять вызовы
__builtin_prefetchв код, для которого известны адреса данных в памяти, которые, вероятно, скоро будут обработаны. Если целевая платформа поддерживает их, генерируются инструкции предварительной выборки данных. Если предварительная выборка выполняется достаточно рано до доступа, данные будут в кэше к моменту доступа.Значение addr — это адрес памяти для предварительной выборки. Существуют два необязательных аргумента, rw и locality. Значение rw — это константа времени компиляции 1 или 0; 1 означает, что предварительная выборка подготавливается к записи в адрес памяти, а 0 (по умолчанию) — к чтению. Значение locality должно быть целочисленной константой времени компиляции от 0 до 3. Значение 0 означает, что данные не имеют временной локальности, поэтому их не нужно оставлять в кэше после доступа. Значение 3 означает, что данные имеют высокую временную локальность и должны оставаться во всех уровнях кэша, насколько это возможно. Значения 1 и 2 означают соответственно низкую или среднюю временную локальность. По умолчанию используется 3.
for (i = 0; i < n; i++) { a[i] = a[i] + b[i]; __builtin_prefetch (&a[i+j], 1, 1); __builtin_prefetch (&b[i+j], 0, 1); /* … */ }Предварительная выборка данных не вызывает ошибок, если addr недействителен, но само выражение адреса должно быть валидным. Например, предварительная выборка
p->nextне вызывает ошибку, еслиp->nextне является допустимым адресом, но вычисление вызывает ошибку, еслиpне является допустимым адресом.Если целевая платформа не поддерживает предварительную выборку данных, выражение адреса вычисляется, если оно содержит побочные эффекты, но не генерируется никакой другой код, и GCC не выдает предупреждение.
-
Встроенная функция:
size_t__builtin_object_size(const void * ptr, int type) Возвращает оценочный размер объекта, на который указывает ptr. Подробное описание функции см. в разделе Проверка размера объекта.
-
Встроенная функция:
size_t__builtin_dynamic_object_size(const void * ptr, int type) Аналогично
__builtin_object_size, за исключением того, что возвращаемое значение необязательно должно быть константой. Подробное описание функции см. в разделе Проверка размера объекта.
-
Встроенная функция:
int__builtin_classify_type(arg) -
Встроенная функция:
int__builtin_classify_type(type) -
Функция
__builtin_classify_typeвозвращает целое число, представляющее категорию типа аргумента arg, например, void type, integer type, enumeral type, boolean type, pointer type, reference type, offset type, real type, complex type, function type, method type, record type, union type, array type, string type, bit-precise integer type, vector type и т.д. Когда аргументом является выражение, по причинам обратной совместимости аргумент преобразуется так же, как аргументы, передаваемые в...в функции varargs, поэтому некоторые классы никогда не возвращаются в определённых языках. В качестве альтернативы, аргументом встроенной функции может быть имя типа, например, спецификаторtypeof.int a[2]; __builtin_classify_type (a) == __builtin_classify_type (int[5]); __builtin_classify_type (a) == __builtin_classify_type (void*); __builtin_classify_type (typeof (a)) == __builtin_classify_type (int[5]);
Первое сравнение никогда не будет истинным, так как a неявно преобразуется в указатель. Последние два сравнения будут истинными, так как они классифицируют указатели во втором случае и массивы в последнем случае.
-
Встроенная функция:
double__builtin_huge_val(void) Возвращает положительную бесконечность, если поддерживается форматом с плавающей точкой, иначе
DBL_MAX. Эта функция подходит для реализации макроса ISO CHUGE_VAL.
-
Встроенная функция:
float__builtin_huge_valf(void) Аналогично
__builtin_huge_val, за исключением того, что тип возвращаемого значения —float.
-
Встроенная функция:
long double__builtin_huge_vall(void) Аналогично
__builtin_huge_val, за исключением того, что тип возвращаемого значения —long double.
-
Встроенная функция:
_Floatn__builtin_huge_valfn(void) Аналогично
__builtin_huge_val, за исключением того, что тип возвращаемого значения —_Floatn.
-
Встроенная функция:
_Floatnx__builtin_huge_valfnx(void) Аналогично
__builtin_huge_val, за исключением того, что тип возвращаемого значения —_Floatnx.
-
Встроенная функция:
int__builtin_fpclassify(int, int, int, int, int, ...) Эта встроенная функция реализует функциональность fpclassify из C99. Первые пять целочисленных аргументов должны представлять понимание целевой библиотекой возможных классов FP и используются для возвращаемых значений. Они должны быть константными значениями и должны появляться в этом порядке:
FP_NAN,FP_INFINITE,FP_NORMAL,FP_SUBNORMALиFP_ZERO. Многоточие предназначено для ровно одного значения с плавающей точкой для классификации. GCC обрабатывает последний аргумент как универсальный по типу, что означает, что он не выполняет стандартное повышение типа с float на double.
-
Встроенная функция:
double__builtin_inf(void) Аналогично
__builtin_huge_val, за исключением того, что генерируется предупреждение, если целевой формат с плавающей точкой не поддерживает бесконечности.
-
Встроенная функция:
_Decimal32__builtin_infd32(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —_Decimal32.
-
Встроенная функция:
_Decimal64__builtin_infd64(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —_Decimal64.
-
Встроенная функция:
_Decimal128__builtin_infd128(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —_Decimal128.
-
Встроенная функция:
float__builtin_inff(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —float. Эта функция подходит для реализации макроса ISO C99INFINITY.
-
Встроенная функция:
long double__builtin_infl(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —long double.
-
Встроенная функция:
_Floatn__builtin_inffn(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —_Floatn.
-
Встроенная функция:
_Floatn__builtin_inffnx(void) Аналогично
__builtin_inf, за исключением того, что тип возвращаемого значения —_Floatnx.
-
Встроенная функция:
int__builtin_isinf_sign(...) Аналогично
isinf, за исключением того, что возвращаемое значение равно -1 для аргумента-Infи 1 для аргумента+Inf. Обратите внимание, что, хотя список параметров является многоточием, эта функция принимает только один аргумент с плавающей точкой. GCC обрабатывает этот параметр как универсальный по типу, что означает, что он не выполняет стандартное повышение типа с float на double.
-
Встроенная функция:
double__builtin_nan(const char *str) -
Это реализация функции ISO C99
nan.Так как ISO C99 определяет эту функцию в терминах
strtod, которую мы не реализуем, необходимо описание синтаксического анализа. Строка разбирается какstrtol; то есть, основание распознаётся по префиксам ‘0’ или ‘0x’. Разбираемое число помещается в мантиссу таким образом, что наименее значимый бит числа находится в наименее значимом бите мантиссы. Число усекается, чтобы соответствовать предоставленному полю мантиссы. Мантисса принудительно устанавливается как тихое NaN.Эта функция, если ей передаётся строковый литерал, который полностью был бы обработан
strtol, вычисляется достаточно рано, чтобы считаться константой времени компиляции.
-
Встроенная функция:
_Decimal32__builtin_nand32(const char *str) Аналогично
__builtin_nan, за исключением того, что тип возвращаемого значения —_Decimal32.
-
Встроенная функция:
_Decimal64__builtin_nand64(const char *str) Аналогично
__builtin_nan, за исключением того, что тип возвращаемого значения —_Decimal64.
-
Встроенная функция:
_Decimal128__builtin_nand128(const char *str) Аналогично
__builtin_nan, за исключением того, что тип возвращаемого значения —_Decimal128.
-
Встроенная функция:
float__builtin_nanf(const char *str) Аналогично
__builtin_nan, за исключением того, что тип возвращаемого значения —float.
-
Встроенная функция:
long double__builtin_nanl(const char *str) Аналогично
__builtin_nan, за исключением того, что тип возвращаемого значения —long double.
-
Встроенная функция:
_Floatn__builtin_nanfn(const char *str) Аналогично
__builtin_nan, за исключением того, что возвращаемый тип —_Floatn.
-
Встроенная функция:
_Floatnx__builtin_nanfnx(const char *str) Аналогично
__builtin_nan, за исключением того, что возвращаемый тип —_Floatnx.
-
Встроенная функция:
double__builtin_nans(const char *str) Аналогично
__builtin_nan, за исключением того, что мантисса принудительно устанавливается как сигнализирующее NaN. Функцияnansпредложена в WG14 N965.
-
Встроенная функция:
_Decimal32__builtin_nansd32(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —_Decimal32.
-
Встроенная функция:
_Decimal64__builtin_nansd64(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —_Decimal64.
-
Встроенная функция:
_Decimal128__builtin_nansd128(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —_Decimal128.
-
Встроенная функция:
float__builtin_nansf(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —float.
-
Встроенная функция:
long double__builtin_nansl(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —long double.
-
Встроенная функция:
_Floatn__builtin_nansfn(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —_Floatn.
-
Встроенная функция:
_Floatnx__builtin_nansfnx(const char *str) Аналогично
__builtin_nans, за исключением того, что возвращаемый тип —_Floatnx.
-
Встроенная функция:
int__builtin_issignaling(...) Возвращает ненулевое значение, если аргумент является сигнализирующим NaN, и нуль в противном случае. Обратите внимание, что хотя список параметров является многоточием, эта функция принимает только один аргумент с плавающей точкой. GCC рассматривает этот параметр как имеющий общий тип, что означает, что он не выполняет стандартное повышение типа от float до double. Эта встроенная функция может работать даже без опции
-fsignaling-nans, отличной от значения по умолчанию, хотя, если сигнализирующее NaN вычисляется, сохраняется или передается как аргумент какой-либо функции, отличной от этой встроенной, в текущем трансляционном блоке, безопаснее использовать-fsignaling-nans. С опцией-ffinite-math-onlyэта встроенная функция всегда будет возвращать 0.
-
Встроенная функция:
int__builtin_ffs(int x) Возвращает единицу плюс индекс наименьшего значащего 1-бита x, или, если x равно нулю, возвращает ноль.
-
Встроенная функция:
int__builtin_clz(unsigned int x) Возвращает количество ведущих 0-битов в x, начиная с наиболее значимого бита. Если x равно 0, результат не определен.
-
Встроенная функция:
int__builtin_ctz(unsigned int x) Возвращает количество завершающих 0-битов в x, начиная с наименее значащего бита. Если x равно 0, результат не определен.
-
Встроенная функция:
int__builtin_clrsb(int x) Возвращает количество ведущих избыточных битов знака в x, т.е. количество битов после наиболее значимого бита, которые идентичны ему. Нет специальных случаев для 0 или других значений.
-
Встроенная функция:
int__builtin_popcount(unsigned int x) Возвращает количество 1-битов в x.
-
Встроенная функция:
int__builtin_parity(unsigned int x) Возвращает четность x, т.е. количество 1-битов в x по модулю 2.
-
Встроенная функция:
int__builtin_ffsl(long) Аналогично
__builtin_ffs, за исключением того, что тип аргумента —long.
-
Встроенная функция:
int__builtin_clzl(unsigned long) Аналогично
__builtin_clz, за исключением того, что тип аргумента —unsigned long.
-
Встроенная функция:
int__builtin_ctzl(unsigned long) Аналогично
__builtin_ctz, за исключением того, что тип аргумента —unsigned long.
-
Встроенная функция:
int__builtin_clrsbl(long) Аналогично
__builtin_clrsb, за исключением того, что тип аргумента —long.
-
Встроенная функция:
int__builtin_popcountl(unsigned long) Аналогично
__builtin_popcount, за исключением того, что тип аргумента —unsigned long.
-
Встроенная функция:
int__builtin_parityl(unsigned long) Аналогично
__builtin_parity, за исключением того, что тип аргумента —unsigned long.
-
Встроенная функция:
int__builtin_ffsll(long long) Аналогично
__builtin_ffs, за исключением того, что тип аргумента —long long.
-
Встроенная функция:
int__builtin_clzll(unsigned long long) Аналогично
__builtin_clz, за исключением того, что тип аргумента —unsigned long long.
-
Встроенная функция:
int__builtin_ctzll(unsigned long long) Аналогично
__builtin_ctz, за исключением того, что тип аргумента —unsigned long long.
-
Встроенная функция:
int__builtin_clrsbll(long long) Аналогично
__builtin_clrsb, за исключением того, что тип аргумента —long long.
-
Встроенная функция:
int__builtin_popcountll(unsigned long long) Аналогично
__builtin_popcount, за исключением того, что тип аргумента —unsigned long long.
-
Встроенная функция:
int__builtin_parityll(unsigned long long) Аналогично
__builtin_parity, за исключением того, что тип аргумента —unsigned long long.
-
Встроенная функция:
int__builtin_ffsg(...) Аналогично
__builtin_ffs, за исключением того, что аргумент является универсальным знаковым целым числом (стандартным, расширенным или битово-точным). К аргументу не применяются повышения типа целочисленных аргументов.
-
Встроенная функция:
int__builtin_clzg(...) Аналогично
__builtin_clz, за исключением того, что аргумент является универсальным беззнаковым целым числом (стандартным, расширенным или битово-точным), и существует необязательный второй аргумент типа int. К первому аргументу не применяются повышения типа целочисленных аргументов. Если указаны два аргумента, и первый аргумент равен 0, результатом является второй аргумент. Если указан только один аргумент, и он равен 0, результат не определен.
-
Встроенная функция:
int__builtin_ctzg(...) Аналогично
__builtin_ctz, за исключением того, что аргумент является универсальным беззнаковым целым числом (стандартным, расширенным или битово-точным), и существует необязательный второй аргумент типа int. К первому аргументу не применяются повышения типа целочисленных аргументов. Если указаны два аргумента, и первый аргумент равен 0, результатом является второй аргумент. Если указан только один аргумент, и он равен 0, результат не определен.
-
Встроенная функция:
int__builtin_clrsbg(...) Аналогично
__builtin_clrsb, за исключением того, что аргумент является универсальным знаковым целым числом (стандартным, расширенным или битово-точным). К аргументу не применяются повышения типа целочисленных аргументов.
-
Встроенная функция:
int__builtin_popcountg(...) Аналогично
__builtin_popcount, за исключением того, что аргумент является универсальным беззнаковым целым числом (стандартным, расширенным или битово-точным). К аргументу не применяются повышения типа целочисленных аргументов.
-
Встроенная функция:
int__builtin_parityg(...) Аналогично
__builtin_parity, за исключением того, что аргумент является универсальным беззнаковым целым числом (стандартным, расширенным или битово-точным). К аргументу не применяются повышения типа целочисленных аргументов.
-
Встроенная функция:
type__builtin_stdc_bit_ceil(type arg) Функция
__builtin_stdc_bit_ceilдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентнаarg <= 1 ? (type) 1 : (type) 2 << (prec - 1 - __builtin_clzg ((type) (arg - 1))), где prec — это разрядность type, за исключением того, что побочные эффекты в arg вычисляются только один раз.
-
Встроенная функция:
type__builtin_stdc_bit_floor(type arg) Функция
__builtin_stdc_bit_floorдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентнаarg == 0 ? (type) 0 : (type) 1 << (prec - 1 - __builtin_clzg (arg)), где prec — это разрядность type, за исключением того, что побочные эффекты в arg вычисляются только один раз.
-
Встроенная функция:
unsigned int__builtin_stdc_bit_width(type arg) Функция
__builtin_stdc_bit_widthдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(unsigned int) (prec - __builtin_clzg (arg, prec)), где prec — это разрядность type.
-
Встроенная функция:
unsigned int__builtin_stdc_count_ones(type arg) Функция
__builtin_stdc_count_onesдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(unsigned int) __builtin_popcountg (arg)
-
Встроенная функция:
unsigned int__builtin_stdc_count_zeros(type arg) Функция
__builtin_stdc_count_zerosдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(unsigned int) __builtin_popcountg ((type) ~arg)
-
Встроенная функция:
unsigned int__builtin_stdc_first_leading_one(type arg) Функция
__builtin_stdc_first_leading_oneдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна__builtin_clzg (arg, -1) + 1U
-
Встроенная функция:
unsigned int__builtin_stdc_first_leading_zero(type arg) Функция
__builtin_stdc_first_leading_zeroдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна__builtin_clzg ((type) ~arg, -1) + 1U
-
Встроенная функция:
unsigned int__builtin_stdc_first_trailing_one(type arg) Функция
__builtin_stdc_first_trailing_oneдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна__builtin_ctzg (arg, -1) + 1U
-
Встроенная функция:
unsigned int__builtin_stdc_first_trailing_zero(type arg) Функция
__builtin_stdc_first_trailing_zeroдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна__builtin_ctzg ((type) ~arg, -1) + 1U
-
Встроенная функция:
unsigned int__builtin_stdc_has_single_bit(type arg) Функция
__builtin_stdc_has_single_bitдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(_Bool) (__builtin_popcountg (arg) == 1)
-
Встроенная функция:
unsigned int__builtin_stdc_leading_ones(type arg) Функция
__builtin_stdc_leading_onesдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(unsigned int) __builtin_clzg ((type) ~arg, prec)
-
Встроенная функция:
unsigned int__builtin_stdc_leading_zeros(type arg) Функция
__builtin_stdc_leading_zerosдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(unsigned int) __builtin_clzg (arg, prec)
-
Встроенная функция:
unsigned int__builtin_stdc_trailing_ones(type arg) Функция
__builtin_stdc_trailing_onesдоступна только в C. Она является универсальной по типу, аргументом может быть любое беззнаковое целое число (стандартное, расширенное или битово-точное). К аргументу не применяются повышения типа целочисленных аргументов. Она эквивалентна(unsigned int) __builtin_ctzg ((type) ~arg, prec)
-
Встроенная функция:
unsigned int__builtin_stdc_trailing_zeros(type arg) Функция
__builtin_stdc_trailing_zerosдоступна только в C. Она является типобезопасной, аргумент может быть любым беззнаковым целым числом (стандартным, расширенным или битовым). Аргументу не выполняются продвижения целочисленных аргументов. Она эквивалентна(unsigned int) __builtin_ctzg (arg, prec)
-
Встроенная функция:
double__builtin_powi(double, int) -
Встроенная функция:
float__builtin_powif(float, int) -
Встроенная функция:
long double__builtin_powil(long double, int) Возвращает первый аргумент, возведённый в степень второго. В отличие от функции
pow, не гарантируется точность и округление.
-
Встроенная функция:
uint16_t__builtin_bswap16(uint16_t x) Возвращает x с изменённым порядком байтов; например,
0xaabbстановится0xbbaa. Байтом здесь всегда является ровно 8 бит.
-
Встроенная функция:
uint32_t__builtin_bswap32(uint32_t x) Аналогично
__builtin_bswap16, за исключением того, что аргумент и возвращаемое значение имеют 32 бита.
-
Встроенная функция:
uint64_t__builtin_bswap64(uint64_t x) Аналогично
__builtin_bswap32, за исключением того, что аргумент и возвращаемое значение имеют 64 бита.
-
Встроенная функция:
uint128_t__builtin_bswap128(uint128_t x) Аналогично
__builtin_bswap64, за исключением того, что аргумент и возвращаемое значение имеют 128 бит. Поддерживается только на целевых платформах, где поддерживаются 128-битные типы.
-
Встроенная функция:
Pmode__builtin_extend_pointer(void * x) На целевых платформах, где размер видимого пользователю указателя меньше размера фактического аппаратного адреса, эта функция возвращает расширенный указатель пользователя. К таким платформам относятся ILP32 режим на x86_64 или Aarch64. Эта функция в основном полезна при написании кода встроенного ассемблера.
-
Встроенная функция:
int__builtin_goacc_parlevel_id(int x) Возвращает идентификатор группы, работника или вектора openacc в зависимости от того, является ли x равным 0, 1 или 2.
-
Встроенная функция:
int__builtin_goacc_parlevel_size(int x) Возвращает размер группы, работника или вектора openacc в зависимости от того, является ли x равным 0, 1 или 2.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Other-Builtins.html