xmllmx
xmllmx

Reputation: 42379

Why does constexpr not compute at compile-time for a string literal?

#include <chrono>
#include <iostream>

constexpr auto strlen_1(char const* sz) {
    auto const* p = sz;

    while (*p) {
        ++p;
    }

    return p - sz;
}

consteval auto strlen_2(char const* sz) {
    auto const* p = sz;

    while (*p) {
        ++p;
    }

    return p - sz;
}

int main() {
    using Clock = std::chrono::steady_clock;
    using Ms = std::chrono::milliseconds;
    using std::chrono::duration_cast;

    auto n = 0;
    auto start = Clock::now();
    {
        for (auto i = 0; i < 1000 * 10000; ++i) {
            n += strlen_1("abcdefghijklmnopqrstuvwxyz");
        }
    }
    auto stop = Clock::now();
    auto elapsed = duration_cast<Ms>(stop - start).count();
    std::cout << "strlen_1: " << elapsed << "ms" << std::endl;

    n = 0;
    start = Clock::now();
    {
        for (auto i = 0; i < 1000 * 10000; ++i) {
            n += strlen_2("abcdefghijklmnopqrstuvwxyz");
        }
    }
    stop = Clock::now();
    elapsed = duration_cast<Ms>(stop - start).count();
    std::cout << "strlen_2: " << elapsed << "ms" << std::endl;

    return n;
}

The output is:

strlen_1: 435ms
strlen_2: 18ms

See https://godbolt.org/z/zMTq64MME

Obviously, strlen_1 doesn't compute at compile-time, while strlen_2 does.

Why does constexpr not compute at compile-time for a string literal?

Upvotes: 0

Views: 108

Answers (0)

Related Questions