Pointer
-
Guten Morgen,
It0101 schrieb:
Oder er tut das Ding in einen shared_ptr, falls er nicht wirklich eine Kopie braucht, sondern nur einen "Link".
Nochmal zur Motivation: Ausgangspunkt ist
firstprivate
von Open MP, siehe hier.Ich versuche einen wrapper zu konzipieren, der einen Datensatz zur Interpolation beinhaltet, d.h. mittels des Datensatzes wird dieser
spline
initialisiert.Wenn ich
firstprivate
richtig verstehe wird ein Objekt 'in jeden Thread kopiert', d.h. jeder Thread hat seine eigene lokale Kopie. In der Beschreibung vonfirstprivate
steht, dass dazu der Copyconstructor des Objekts aufgerufen wird - und an diesem Punkt stehe ich gerade: Ich verstehe das so, dass quasi in jedem Thread ein ihm eigenes Objekt über den Copykonstruktor initialisiert wird, d.h. jedes kopierte Objekt ist komplett selbst für seine Inhalte verantwortlich.Aus dem Grund denke ich auch, dass Referenzen ein Widerspruch sind, denn ich will nicht in jedem Thread ein Objekt, das über Referenzen auf das Ursprungsobjekt zugreift.
Also benötige ich einen Move Constructor?
Gruß,
-- Klaus.
-
Die GSL bietet keine Funktion für eine tiefe Kopie eines
gsl_spline
-Objekts an. Aber das wäre genau das, was du willst (bzw zu wollen glaubst). Stattdessen musst Du wohl mitgsl_spline_alloc
undgsl_spline_init
arbeiten. Und dazu müsste man dann das Fucking Manual lesen.
-
So,
ich denke ich habe es jetzt:Der Kopierkonstruktor kann leider nicht kopieren, aber mit dem Inhalt des zu kopierenden Objekts bin ich in der Lage im neuen Objekt neu zu initialisieren.
Anbei noch der move constructor und move assignment operator.
Jetzth habe ich doch aber alles, oder nicht?
Und die magische Zeile 57
acc(rhs.acc),spline(rhs.spline)
funktioniert nun, weil ich
interpolation
als Rvalue caste? Als Lvalue würde es einfach die Adresse des einen Pointers in den anderen schreiben./* interpolation.h */ #ifndef INTERPOLATION_H_ #define INTERPOLATION_H_ #include <iostream> #include <vector> #include <gsl/gsl_spline.h> #include <gsl/gsl_errno.h> struct interpolation { interpolation(); interpolation(std::vector<double>, std::vector<double>); interpolation(const interpolation&); interpolation& operator=(const interpolation&); interpolation& operator=(interpolation&&); interpolation(interpolation&&); ~interpolation(); double operator()(double); std::vector<double> x,y; gsl_interp_accel *acc; gsl_spline *spline; }; #endif
/* interpolation.cpp */ #include <iostream> #include "interpolation.h" /* ---{}--- default constructor ---{}--- */ interpolation::interpolation():x(),y(), acc(nullptr),spline(nullptr) {} /* ---{}--- constructor ---{}--- */ interpolation::interpolation(std::vector<double> x, std::vector<double> y): x(x), y(y), acc(gsl_interp_accel_alloc()), spline(gsl_spline_alloc(gsl_interp_cspline,x.size())) { gsl_spline_init(spline,x.data(),y.data(),x.size()); } /* ---{}--- copy constructor ---{}--- */ interpolation::interpolation(const interpolation& rhs): x(rhs.x),y(rhs.y), acc(gsl_interp_accel_alloc()), spline(gsl_spline_alloc(gsl_interp_cspline,x.size())) { gsl_spline_init(spline,x.data(),y.data(),x.size()); } /* ---{}--- assignment operator ---{}--- */ interpolation& interpolation::operator=(const interpolation& rhs) { if( this != &rhs) { gsl_interp_accel_free(acc); gsl_spline_free(spline); x.clear(); y.clear(); x = rhs.x; y = rhs.y; acc = gsl_interp_accel_alloc(); spline = gsl_spline_alloc(gsl_interp_cspline,x.size()); gsl_spline_init(spline,x.data(),y.data(),x.size()); } return *this; } /* ---{}--- move constructor ---{}--- */ interpolation::interpolation(interpolation&& rhs): x(rhs.x),y(rhs.y), acc(rhs.acc),spline(rhs.spline) { rhs.acc = nullptr; rhs.spline = nullptr; } /* ---{}--- move assignment operator ---{}--- */ interpolation& interpolation::operator=(interpolation&& rhs) { if( this != &rhs) { gsl_interp_accel_free(acc); gsl_spline_free(spline); x.clear(); y.clear(); x = rhs.x; y = rhs.y; acc = gsl_interp_accel_alloc(); spline = gsl_spline_alloc(gsl_interp_cspline,x.size()); gsl_spline_init(spline,x.data(),y.data(),x.size()); rhs.x.clear(); rhs.y.clear(); gsl_interp_accel_free(rhs.acc); gsl_spline_free(rhs.spline); rhs.acc = nullptr; rhs.spline = nullptr; } return *this; } /* ---{}--- destructor ---{}--- */ interpolation::~interpolation() { gsl_interp_accel_free(acc); gsl_spline_free(spline); } /* ---{}--- operator() ---{}--- */ double interpolation::operator() (double x) { return gsl_spline_eval(spline,x,acc); }
Gruß,
-- Klaus.