Wenn beschränken zu verwenden und wann nicht
-
08-07-2019 - |
Frage
Ich habe ein allgemeines Verständnis von restrict
aber ich hoffe, einige feine Punkte zu klären. Ich habe eine Funktion, die einen nullterminierten String von einem Puffer liest und schreibt in einem anderen Puffer eine URL codierte Version heraus. Die Funktion hat diese Unterschrift (zur Zeit ohne restrict
):
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
unencoded
ist meine nullterminierte Quellzeichenfolge. Der Zielpuffer wird durch encoded
und encodedEnd
dargestellt, wobei encoded
zeigt auf den ersten char
in den Puffer und encodedEnd
zeigt auf das erste Zeichen nach der Puffer, dh die Funktion char
s bis zu aber schreiben ohne die Lage zu spitz durch encodedEnd
-. dies Ihr Grund begin
/ end
Iterator Paar ist, wenn Sie mit C ++ STL Konventionen vertraut sind
Wenn ich restrict
diese Funktion hinzufügen, sollte es nur auf die ersten beiden Parameter angewandt werden:
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
oder gibt es einen gewissen Nutzen ich verstehen mich nicht, indem sie es auf alle drei Parameter angeben können?
kann ich sehen, dass die Eingangs- und Ausgangspuffer restrict
macht den Compiler wissen hilft, dass sie sich nicht überlappen. Aber seit dem letzten Parameter, encodedEnd
wird nur verwendet, um das Ende des Ausgangspuffers zu markieren, ich bin, dass restrict
denken würde nicht wirklich jede Hilfe hier an den Compiler sein (obwohl ich es annehmen würde nicht schaden, andere als Zugabe unnötiger Lärm zu der Funktionsdeklaration).
Lösung
Versuchen Mike Acton Artikel hier . Beschränken erschreckend ist sowohl wegen der Auswirkungen auf die Leistung von nicht verwenden und die Folgen davon falsch verwendet wird.
In Ihrem Fall, es klingt wie Sie sicher auf alle drei Zeiger wie keine alias der gleichen Speicherbereich beschränken gelten könnte. Doch es geht zu keinem Performance-Vorteil sein wenig von ihm auf dem dritten Zeiger verwendet wird.
Andere Tipps
In diesem speziellen Fall wird es keinen Unterschied, ob encodedEnd machen ist beschränken oder nicht; Sie haben die Compiler, dass niemand Aliase nicht codiert versprochen und verschlüsselt , und so das Lesen und Schreiben wird nicht miteinander interferieren.
Der wahre Grund, der wichtig ist in diesem Fall beschränken ist, ohne es zu, dass der Compiler nicht wissen kann, dass schreibt über codierte beeinflussen wird nicht durchliest nicht codiert . Zum Beispiel, wenn
encoded == unencoded+1
dann jeder schreiben verschlüsselt würde jede nachfolgende Lese beeinflussen von nicht codierten , so kann der Compiler die Last nicht planen, bis der Schreib abgeschlossen hat. beschränken verspricht den Compiler, dass die beiden Zeiger nicht den gleichen Speicher beeinflussen, so kann er Lasten planen weit genug vor Pipeline-Blockierungen zu vermeiden.
Ich glaube, du hast Recht, dass es nicht schaden würde. Ihre Schleifenzeiger (nennen wir es p) wird encodedEnd am Ende der Schleife gleich. Aber nichts braucht nach der Schleife zugegriffen werden (entweder p oder encodedEnd), so das sollte kein Problem sein. Ich glaube nicht, es wird dazu beitragen, entweder, weil nichts jemals oder von encodedEnd lesen ist so geschrieben, es gibt nichts, weg zu optimieren.
Aber ich stimme mit Ihnen die ersten beiden mit beschränken sollte wirklich helfen.