Wie in den Kommentaren erwähnt, unterstützen viele neuere C++ - Compiler die C99-Implementierung des Einschränkungsqualifizierers. Da restrict
in C++ kein reserviertes Schlüsselwort ist, verwenden die Compiler im Allgemeinen __restrict
oder __restrict__
. Sowohl GCC als auch Visual C++ dokumentieren dies sehr schön mit expliziten Verweisen auf C99.
Der C++ 1998-Standard besagt, dass "der typedef
specifier darf nicht ... außer einem Typ-Spezifizierer in einem Decl-specifier-Seq mit jeder Art von Spezifikations kombiniert werden." Im Wesentlichen muss es eine Liste von Typ-Bezeichner, die die beiden CV-Qualifier, const
und volatile
enthält.
C99 definiert typedef ähnlich, außer dass die Liste der Qualifier restrict
enthält.
Es scheint vernünftig zu sein, ähnliche Unterstützung in typedefs für die Nicht-Standard __restrict
vorauszusehen ... aber man kann nie wissen!
Eine clevere und einfache Möglichkeit, dies zu testen, wie folgt:
extern void link_fail();
typedef int *__restrict restricted_int_p;
void test(restricted_int_p a, restricted_int_p b) {
*a = 1;
*b = 2;
if (*a == 2) link_fail();
}
Dies einfach nutzt die Tatsache, dass, wenn das ungelöste link_fail
Symbol in der Objektdatei gefunden wird, wird der Linker einen Fehler aus. Wenn der Compiler die beiden Argumente korrekt einschränkt, sollte er den Wert a
kennen, auch wenn b
geändert wird. Daher sollte der gesamte if-Block aus der generierten Objektdatei entfernt werden, da er nie ausgeführt wird.
Beachten Sie, dass obwohl GCC die restrictsyntax seit mindestens Version 3.0 unterstützt hat, die eigentlichen Optimierungen erst nach version 4.5 durchgeführt wurden.
Ich denke, es kompiliert, wenn ich 'typedef const double * __restricte Typ;' aber schafft es restricte double * oder eine Art von Restriction auf 'type' angewendet? – Anycorn
Versuchen Sie und sehen. 'restrict' ist nicht vom C++ Standard definiert, also ymmv. Wenn ich mich richtig an meine eigenen Erfahrungen erinnere, beteiligt sich restrict an typedefs in GCC. – Potatoswatter
@P wie kann ich das tun? Schauen Sie sich direkt die Montage an und sehen Sie den Unterschied? restrict ist in c99, ich dachte __restrict war C++? – Anycorn