Quantcast
Viewing all articles
Browse latest Browse all 22149

constexpr: gcc is trying harder to eval constexpr than clang

I'm using godbolt to see generated code with gcc and clang.

I tried to implement to djb2 hash.

gcc always trying is best to eval constexpr function.

clang is evaluating constexpr only if the variable is constexpr.

Let's see the example:

constexpr int djb2(char const *str)
{
    int hash = 5381;
    int c = 0;

    while ((c = *str++))
    hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
        return hash;
}

int main()
{
    int i = djb2("hello you :)");
}

With this example, gcc is evaluating a compile time i. But clang at run time.

If I add constexpr to i, clang is evaluating also at compile time.

Do you know if the standard is saying something about that ?

EDIT: thanks to all. So, as I understand, without constexpr the compiler is doing what is want. With constexpr, the compiler is forced to evaluating the constant.


Viewing all articles
Browse latest Browse all 22149

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>