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 chars 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).

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top