Vor ein paar Tagen habe ich entdeckt, dass Sie die Kompilierungszeit strlen
mit etwas wie diesem finden können:
Wenn es kompiliert ist, dann ist alles gut. Sie können eine Überladung wie folgt hinzufügen:
%Vor%Dann wird es immer kompiliert.
Meine Frage ist - verwendet C ++ <cstring>
so etwas und wenn nicht - warum?
Nein, tut es nicht. Weil es die falsche Antwort gibt.
%Vor% Auch bei Ihren 2 Überladungen wird die Vorlage niemals aufgerufen. Die Nicht-Vorlage, die ein const char*
akzeptiert, wird immer bevorzugt.
Dies bedeutet nicht, dass strlen nicht zur Kompilierzeit mit einer Compiler-Magie berechnet werden kann. Aber es kann nicht so gemacht werden, indem man die richtige Sprache benutzt.
Dein strlen
_ funktioniert nicht: Ссылка
Außerdem: Ich weiß genau, dass Visual Studio 2015 alle Arten von strlen
-Aufrufen optimiert, sogar in Situationen, in denen ich Zweifel hatte, die beim Überprüfen der Assembly-Ausgabe verschwunden waren, die nicht runtime
% generiert haben. co_de% ruft auf.
Und wie @ Calvin sagt, scheint Clang das Gleiche zu tun. Es gibt also wirklich keinen Grund dafür.
Ihr Code ist fehlerhaft.
Die korrekte Methode zur Kompilierung der Zeitoptimierung für strlen()
ist überraschenderweise nur Aufruf von strlen()
. moderne Kompilierung wie clang wird unnötige strlen()
optimieren, wenn sie die Länge zur Kompilierzeit kennt.
Auch in den meisten Fällen ist sizeof
nützlich, wenn Sie, der Programmierer, es richtig mit Variablen verwenden, die literale Strings enthalten. wie:
Beachten Sie, dass dies eine gewisse Annahme hat und wenn Sie dies tun, machen Sie sich Ärger, aber machen Sie Ihr Leben nicht einfach:
%Vor%EDITED: Um das Offensichtliche mehr wie eine Antwort aussehen zu lassen.
Folge von der ZDF-Antwort.
Ich habe getestet und es scheint wie vorzeitige Optimierung.
Der Code wurde mit:
kompiliert %Vor%und hier ist, wie viel Zeit es dauerte:
%Vor% Clang scheint etwas schneller zu sein, aber bei voller Optimierung hat sich constexpr strlen_c()
nicht ausgezahlt.
Lass es mich wissen, wenn ich etwas falsch im Code gemacht habe.