[Dune] const Referenzen ausliefern

Adrian Burri burriad at mathematik.uni-freiburg.de
Tue Oct 18 17:13:22 CEST 2005


Hallo,

eine Loesungsmoeglichkeit waere die folgende: Man betrachte folgendes 
Beispiel
struct Callee {
    const Object& foo();
};
Anstatt einer Referenz gibt Callee nun ein Proxy zurueck, das nicht mehr 
enthaelt als einen Pointer auf das eigentliche Objekt und das 
Callee-Objekt, wo es aufgefordert wurde:
struct Callee {
    ObjectProxy foo();
};

struct ObjectProxy {
    Object* obj_;
    Callee* callee_;
    // Forwards everything to obj_
};

Die Callee-Klasse verwaltet die Objects, die es in den Proxy steckt, so 
dass man nicht zu viele teure Objekte rumliegen hat. Gleichzeitig kann 
man verhindern, dass einem das Object und den Finger weggezogen bzw. 
veraendert wird, da das entsprechende Callee-Objekt es erst wieder frei 
gibt, wenn das entsprechende ObjectProxy out of scope geht. Zusaetzlich 
kann man noch Reference counting fuer das ObjectProxy verwenden,
um das kopieren und zuweisen einfach zu machen, und dann hat man alle 
Vorteile, mit hoffentlich nicht allzu grossen Leistungseinbussen, da 
anstelle der teuren Objekte nur die Proxies kopiert und rumgereicht 
werden. Natuerlich, die Pointer muessen kopiert werden und die Pointer 
indirection kommen dazu, und uebersichtlicher wird der Code auch nicht!

Robert und ich haben diese Loesung heute gerade fuer unsere 
LocalFunctions implementiert, ohne groessere Probleme. Man muesste mal 
profilen, um zu schauen, wie effizient das Verfahren wirklich ist.

Gruss Adi

Peter Bastian wrote:

>Hallo ihr,
>
>ich musste heute auf die harte Tour lernen, dass const Referenzen
>ausliefern echt blöd ist. In meinem Fehlerschätzer habe ich mir aus
>Effizienzgründen eine Referenz auf die (nun transponierte) Jacobimatrix
>gemerkt:
>
>const Dune::FieldMatrix<DT,n,n>& nbjac =
>it.outside()->geometry().jacobianInverseTransposed(nblocal);
>
>Das funktionierte in sgrid und yaspgrid wunderbar. Klar, denn dort sitzt
>der Speicher für die Jacobimatrix im IntersectionIterator. In UGGrid und
>AlbertaGrid ist das aber leider anders, dort wird in der Methode
>outside() ein EntityPointer und in diesem eine Geometry angelegt, die
>referenz ausgeliefert und dann der EntityPointer wieder weggeschmissen.
>Die Referenz auf Speicher irgendwo im Stack lebt weiter und die Matrix
>wird später dann überschrieben. Heraus kommt Mist in der Numerik aber
>kein Segfault. Sowas ist echt dumm.
>
>Wollen wir nicht die Sache mit den Referenzen ausliefern nochmal überdenken?
>
>Grüße
>
>-- Peter
>------------------------------------------------------------------
>Peter Bastian, IWR,Uni Heidelberg, INF 348,R 020, 69120 Heidelberg
>email: Peter.Bastian at iwr.uni-heidelberg.de   Tel: +49 6221 54 4984
>WWW: http://www.iwr.uni-heidelberg.de/~Peter.Bastian Fax: ... 8860
>
>
>_______________________________________________
>Dune mailing list
>Dune at hal.iwr.uni-heidelberg.de
>http://hal.iwr.uni-heidelberg.de/cgi-bin/mailman/listinfo/dune
>  
>




More information about the Dune mailing list