Kann __restrict__ auf shared_ptrT angewendet werden?

8

Intelligente Zeiger sind Zeiger darunter, also gibt es eine Möglichkeit, einen shared_ptr -Parameter für eine Funktion so zu definieren, dass kein anderer shared_ptr oder ein anderer Zeiger irgendeiner Art aliasiert wird?

Oder ist das aus irgendeinem Grund unnötig?

Ich habe mit den Compilern gcc & gt; = 4.2 und llvm-clang & gt; = 2.0 zu tun (Antworten für andere Compiler wären auch interessant).

    
James 29.01.2012, 00:25
quelle

2 Antworten

7

Extrahiere einfach die Zeiger mit .get() und markiere sie als __restrict__ . Denken Sie daran, dass das Einfügen von __restrict__ in die Funktionsparameter dasselbe ist wie das Setzen von __restrict__ auf lokale Variablen. Insbesondere versucht der Compiler nicht, Sie davon abzuhalten, die Funktion mit zwei Zeigern aufzurufen, die offensichtlich auf dasselbe Objekt zeigen; z.B. foo(i,i) .

Wenn Sie dem Compiler versprechen wollen, dass bestimmte Zeiger nicht aufeinander verweisen, erlauben Sie dem Compiler, mehr Optimierungen zu machen, dann benutzen Sie diesen Code unten und führen Sie Ihre Operationen durch xp und yp statt x und y .

%Vor%     
Aaron McDaid 29.01.2012, 00:53
quelle
5

Wenn Sie nicht-aliasierte Operationen für das zugrunde liegende Objekt ausführen möchten, das einem gemeinsamen Zeiger zugeordnet ist, können Sie explizit an eine Worker-Routine delegieren, die einen nicht-aliasierten Zeigerparameter verwendet:

%Vor%

Ich bin mir nicht sicher, was genau Sie im Sinn haben, aber dies würde es ermöglichen, dass die High-Level-Speicherverwaltung sicher durch den Smart Pointer gehandhabt wird, während die Low-Level-Arbeit möglicherweise mehr effizient mit No-Alias-Zeigern.

Wie @BenVoigt darauf hingewiesen hat, ist restrict nur ein offizieller Teil von c99 - c++ soll nichts darüber wissen. MSVC unterstützt es trotzdem via __restrict und wie du gesagt hast GCC hat __restrict__ .

Hoffe, das hilft.

    
Darren Engwirda 29.01.2012 00:52
quelle