Это потому, что gcc
достаточно умен, чтобы выяснить, что квадратный корень из константы 2 является также константой, поэтому он просто генерирует код, подобный:
mov register, whatever-the-square-root-of-2-is
Следовательно, нет необходимости выполнять квадратный корень во время выполнения, gcc
уже сделал это во время компиляции.
Это похоже на программу сравнения, которая выполняет множество вычислений, но ничего не делает с результатом:
int main (void) {
// do something rather strenuous
return 0;
}
Скорее всего (на высоких уровнях оптимизации) вы увидите, что весь код do something rather strenuous
оптимизирован за время существования.
Документы gcc
имеют целую страницу, посвященную этим встроенным элементам здесь , а соответствующий раздел на этой странице для sqrt
и других страниц:
Функции ISO C90 abort, abs, acos, asin, atan2, atan, calloc, ceil, cosh, cos, exit, exp, fabs, floor, fmod, fprintf, fputs, 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, 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
не указано для отдельной функции).
Итак, довольно много, правда: -)