literal constant vs variable in math library

前端 未结 4 729
终归单人心
终归单人心 2020-12-03 19:34

So, I know that in C you need to link the code to the math library, libm, to be able to use its functions. Today, while I was trying to demonstrate

4条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-03 20:02

    That's because gcc is clever enough to figure out that the square root of the constant 2 is also a constant, so it just generates code like:

    mov register, whatever-the-square-root-of-2-is
    

    Hence no need to do a square root calculation at run time, gcc has already done it at compile time.

    This is akin to a benchmarking program which does bucketloads of calculations then does nothing with the result:

    int main (void) {
        // do something rather strenuous
        return 0;
    }
    

    You're likely (at high optimisation levels) to see all the do something rather strenuous code optimised out of existence.

    The gcc docs have a whole page dedicated to these built-ins here and the relevant section in that page for sqrt and others is:

    The ISO C90 functions 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 and vsprintf are all recognized as built-in functions unless -fno-builtin is specified (or -fno-builtin-function is specified for an individual function).

    So, quite a lot, really :-)

提交回复
热议问题