Reputation: 42379
#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