Wie sage ich einem C- oder C ++ - Compiler, dass Pointern kein Alias ​​zugewiesen sind

8

Ich habe eine Funktion, die ein Array von Zeigern wie folgt empfängt:

%Vor%

Was ich dem Compiler mitteilen möchte ist, dass die Zeiger ptrs[i] keine Aliase voneinander sind und dass sich die Arrays ptrs[i] nicht überlappen. Wie soll ich das machen? Mein Hintergedanke ist die automatische Vektorisierung zu fördern.

Gibt es auch eine Möglichkeit, den gleichen Effekt wie __restrict__ für einen Iterator von std::vector zu erhalten?

    
san 07.09.2011, 03:08
quelle

3 Antworten

9

restrict ist im Gegensatz zu der häufigeren const eine Eigenschaft des -Zeigers und nicht die -Daten, die auf verweisen. Es gehört daher auf die Seite rechts des deklarator-modifier ' * '. [] in einer Parameterdeklaration ist eine andere Möglichkeit, * zu schreiben. Wenn Sie diese Dinge zusammenfügen, sollten Sie mit diesem Funktionsprototyp den gewünschten Effekt erzielen:

%Vor%

und keine Notwendigkeit für neue Namen. (Nicht getestet. Ihre Laufleistung kann variieren.% Co_de% ist ein reiner Optimierungshinweis und kann eigentlich nichts konstruktiv mit Ihrem Compiler machen.)

    
zwol 07.09.2011, 03:24
quelle
7

Etwas wie:

%Vor%

... sollte es tun, denke ich, in C99. Ich denke nicht, dass es in C ++ einen Weg gibt, aber viele C ++ - Compiler unterstützen auch die Einschränkung.

    
davmac 07.09.2011 03:13
quelle
4

In C ++ wird angenommen, dass Zeigerargumente keinen Aliasnamen haben, wenn sie auf grundlegend verschiedene Typen zeigen ("strikte Alias-Regeln").

In C99 gibt das Schlüsselwort "restrict" an, dass ein Zeigerargument keinem anderen Zeigerargument Aliasnamen zuweist.

    
Mu Qiao 07.09.2011 03:11
quelle