2010-05-01 11 views
11

Gibt es eine Möglichkeit, mit typedef integral/float Typ zu definieren, die keine Aliasng impliziert?C/C++ __Haltestyp

etwas äquivalent zu (aber primitives Konstrukt):

template < typename T > 
struct restrict { T* __restrict data; }; 

als nahe stehende Frage ist es möglich, gcc zu fragen, was es alias/keine Alias-Pointer ist bestimmt?

+0

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

+0

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

+0

@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

Antwort

19

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.

+0

"C99 definiert typedef in ähnlicher Weise, außer dass die Liste der Qualifier restricte enthält." Ich habe [eine Frage dazu] gestellt (http://stackoverflow.com/q/43631062/2542702) und jeder (der das bisher kommentiert hat) hält es für eine schlechte Idee. Kannst du einen Kommentar abgeben? Ist es legal C, einen Zeiger mit restricte zu schreiben? –