C++Guns – RoboBlog

05.03.2017

TODO C++ Guns - Vererbung und Datenstrukturen und Performance

Filed under: Allgemein — Tags: — Thomas @ 20:03

Ich denke, Vererbung und Datenstrukturen sind nicht gut für die Performance.
Mir ist auch noch kein so wirklicher Anwendungsfall in der Praxis begegnet. Heute habe ich mal was probiert.
Ein Stück Kanal, welches in der Erde liegt und Abwasser durch schwimmt, nenne ich von nun an eine Haltung. Eine Haltung hat mehrere Attribute, die für eine Kanalnetzberechnung von Bedeutung sind. Z.B. Nummer, Länge, Breite, Profil, Rauigkeitswert, Zulauf und Ablauf Haltungen. Diese Variablen müssen für die Performance nah im RAM beieinander liegen. Es sollten also keine Variablen im Datentype existieren, die nicht für die Berechnugn relevant sind. Aber dennoch hat eine Variable weitere Attribute, wie z.B. den Straßennamen, Haltungsbezeichner, Schachtbezeichner und viele mehr.
Es ergeben sich also zwei getrennte Datentypen die beide eine Haltung darstellen. Das ist verwirrend. Ich kann natürlich einen normalen Haltungsdatentyp erstellen mit allen Attribute und einen Performance Haltungsdatentyp mit nur wenigen wichtigen Attribute. Aber das ist auch eine Art doppelter Code.
Also versuchen wir es mal mit Vererbung. Der Datentyp Haltung erbt vom Datentype HaltungPerformance.


struct HaltungPerformance {
    int NR = 0;
    double laenge = 0;
    int B = 0;
    int profilKennziffer = 0;
    int ZU[3];
    int AB[2];
    int KB = 1;
};

struct Haltung : public HaltungPerformance
{
    string strassenNamen;
    string bezeichner;
    string schachtBezOben, schachtBezUnten;
};

class DataBase {
public:
private:
  std::vector<Haltung> haltungen;
}

Das Befüllen der Datenstruktur und das normale Arbeiten mit Haltungen ist einfach. Das ein Teil der Haltung in einem zweite Klasse ausgelagert ist, ist hier transparent und für den Programmierer nicht sichtbar.

Aber wie kann mit der performanten Haltungs- Klasse die Berechnung durchgeführt werden? Eine Möglichkeit ist es, eine Kopie der HaltungPerformance Daten zu machen und in ein extra vector zu speichern.


  std::vector<HaltungPerformance> haltungenRechnen(begin(haltungen), end(haltungen));

Nunja, vorher hatten wir doppelten Code, nun haben wir doppelte Daten. Gibt es noch einen anderen Weg?
Versuchen wir es mal nicht mit Vererbung, sondern mit Composition? (Sagt man das so?)

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress