Ich versuche, die Länge eines String-Literals zur Kompilierungszeit zu berechnen. Dazu verwende ich folgenden Code:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Alles funktioniert wie erwartet, das Programm druckt 4 und 8. Der durch clang generierte Assembler-Code zeigt, dass die Ergebnisse zur Kompilierungszeit berechnet werden:
0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d"
0x100000f65: movl $0x4, %esi
0x100000f6a: movl $0x8, %edx
0x100000f6f: xorl %eax, %eax
0x100000f71: callq 0x100000f7a ; symbol stub for: printf
Meine Frage: lengthWird durch den Standard garantiert, dass die Kompilierungszeit der Funktion ausgewertet wird?
Wenn dies zutrifft, hat sich mir gerade die Tür für Berechnungen von Zeichenfolgenliteralen zur Kompilierungszeit geöffnet ... zum Beispiel kann ich Hashes zur Kompilierungszeit berechnen und vieles mehr ...
<cstdio>und anschließender Anrufe, ::printfist nicht portabel. Der Standard muss nur <cstdio>bereitstellen std::printf.
printfwas dazu führen kann, dass deutlich weniger Code bearbeitet werden muss .