2012-10-11 4 views
5

Im Programm Ich bin Codierung, einer meiner Funktion Erklärungen geht so:Sollte ich __restriction auf Referenzen verwenden?

bool parse(const sentence & __restrict sentence) 
{ 
    // whatever 
} 

Wenn ich den Code mit Microsoft Visual Studio 2010 Express kompilieren, der Compiler beschwert sich:

Warnung C4227: Anachronismus verwendet: Qualifier auf Referenz werden ignoriert

jedoch this page von GCC in der Dokumentation sagt:

Zusätzlich zu den eingeschränkten Zeigern können Sie eingeschränkte Referenzen angeben, die angeben, dass der Verweis im lokalen Kontext kein Alias ​​enthält.

Und die gleiche Seite gibt ein sehr explizites Beispiel:

void fn (int *__restrict__ rptr, int &__restrict__ rref) 
{ 
    /* ... */ 
} 

Haben falsch verstehe ich MVSC die Warnung? oder sollte ich alle meine Referenzen in Zeiger umwandeln, so dass __restrict gilt?

+1

Was ist der Sinn des Vergleichs von MSVC und GCC hier? '__restrict' ist eine ** Anbietererweiterung **, Sie müssen also nach den Regeln jedes Anbieters spielen. –

Antwort

8

C++ hat keine Vorstellung von restrict in der Art, wie C99 tut.

Mehrere Compilerhersteller bieten jedoch Erweiterungen für ihre C++ - Compiler an, die sie __restrict aufrufen (beachten Sie den reservierten Namen!). Vorausgesetzt, dass diese Erweiterungen sind, wird ihr Verhalten von der ­ pi ­ Hersteller bestimmt. Sie müssen die Dokumentation lesen und herausfinden, was diese Erweiterung in jedem ­ pi ­ ler separat macht.

Nur weil zwei Anbieter den gleichen Namen gewählt haben, bedeutet das nicht, dass die Erweiterungen nichts gemeinsam haben.

+0

Können Sie ein Beispiel geben, wo zwei Erweiterungen denselben Namen aber unterschiedliche Bedeutung für verschiedene Compiler haben? – rsp1984

+0

@RafaelSpring: Sicher. Im DS9K-Compiler hat jeder Name, der mit doppelten Unterstrichen beginnt, bei jedem Übersetzungslauf eine andere Bedeutung :-) –

0

Vermutlich seit es mit ____restrict beginnt, ist eine implementierungsspezifische Erweiterung, die sich so verhalten kann, wie jede Implementierung es wünscht. Ich kann mir vorstellen, dass beide Compiler in diesem Fall korrekt sind.

Anstatt die Verweise auf Zeiger zu ändern, vermeiden Sie restrict vollständig, anstatt einen Profiler zu verwenden, um Ihre Hotspots zu finden, und nur wenn es zeigt, dass ein solches Aliasing, das nicht von den strengen C++ - Aliasregeln abgedeckt wird, erhebliche CPU-Zeit beansprucht würde ich in Erwägung ziehen, eine bestimmte Referenz auf einen Zeiger zu ändern.

Verwandte Themen