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 von firstprivate 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 mit gsl_spline_alloc und gsl_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.


Anmelden zum Antworten