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: length
Wird 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, ::printf
ist nicht portabel. Der Standard muss nur <cstdio>
bereitstellen std::printf
.
printf
was dazu führen kann, dass deutlich weniger Code bearbeitet werden muss .