{"id":2792,"date":"2017-03-05T20:49:28","date_gmt":"2017-03-05T19:49:28","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=2792"},"modified":"2017-03-09T11:37:06","modified_gmt":"2017-03-09T10:37:06","slug":"vererbung-und-datenstrukturen-und-performance","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=2792","title":{"rendered":"TODO C++ Guns - Vererbung und Datenstrukturen und Performance"},"content":{"rendered":"<p>Ich denke, Vererbung und Datenstrukturen sind nicht gut f\u00fcr die Performance.<br \/>\nMir ist auch noch kein so wirklicher Anwendungsfall in der Praxis begegnet. Heute habe ich mal was probiert.<br \/>\nEin St\u00fcck Kanal, welches in der Erde liegt und Abwasser durch schwimmt, nenne ich von nun an eine Haltung. Eine Haltung hat mehrere Attribute, die f\u00fcr eine Kanalnetzberechnung von Bedeutung sind. Z.B. Nummer, L\u00e4nge, Breite, Profil, Rauigkeitswert, Zulauf und Ablauf Haltungen. Diese Variablen m\u00fcssen f\u00fcr die Performance nah im RAM beieinander liegen. Es sollten also keine Variablen im Datentype existieren, die nicht f\u00fcr die Berechnugn relevant sind. Aber dennoch hat eine Variable weitere Attribute, wie z.B. den Stra\u00dfennamen, Haltungsbezeichner, Schachtbezeichner und viele mehr.<br \/>\nEs ergeben sich also zwei getrennte Datentypen die beide eine Haltung darstellen. Das ist verwirrend. Ich kann nat\u00fcrlich einen normalen Haltungsdatentyp erstellen mit allen Attribute und einen Performance Haltungsdatentyp mit nur wenigen wichtigen Attribute. Aber das ist auch eine Art doppelter Code.<br \/>\nAlso versuchen wir es mal mit Vererbung. Der Datentyp Haltung erbt vom Datentype HaltungPerformance. <\/p>\n<pre><code>\r\nstruct HaltungPerformance {\r\n    int NR = 0;\r\n    double laenge = 0;\r\n    int B = 0;\r\n    int profilKennziffer = 0;\r\n    int ZU[3];\r\n    int AB[2];\r\n    int KB = 1;\r\n};\r\n\r\nstruct Haltung : public HaltungPerformance\r\n{\r\n    string strassenNamen;\r\n    string bezeichner;\r\n    string schachtBezOben, schachtBezUnten;\r\n};\r\n\r\nclass DataBase {\r\npublic:\r\nprivate:\r\n  std::vector&ltHaltung> haltungen;\r\n}\r\n<\/code><\/pre>\n<p>Das Bef\u00fcllen 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\u00fcr den Programmierer nicht sichtbar.<\/p>\n<p>Aber wie kann mit der performanten Haltungs- Klasse die Berechnung durchgef\u00fchrt werden? Eine M\u00f6glichkeit ist es, eine Kopie der HaltungPerformance Daten zu machen und in ein extra vector zu speichern.<\/p>\n<pre><code>\r\n  std::vector&ltHaltungPerformance> haltungenRechnen(begin(haltungen), end(haltungen));\r\n<\/code><\/pre>\n<p>Nunja, vorher hatten wir doppelten Code, nun haben wir doppelte Daten. Gibt es noch einen anderen Weg?<br \/>\nVersuchen wir es mal nicht mit Vererbung, sondern mit Composition? (Sagt man das so?)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich denke, Vererbung und Datenstrukturen sind nicht gut f\u00fcr die Performance. Mir ist auch noch kein so wirklicher Anwendungsfall in der Praxis begegnet. Heute habe ich mal was probiert. Ein St\u00fcck Kanal, welches in der Erde liegt und Abwasser durch schwimmt, nenne ich von nun an eine Haltung. Eine Haltung hat mehrere Attribute, die f\u00fcr [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-2792","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2792"}],"version-history":[{"count":4,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2792\/revisions"}],"predecessor-version":[{"id":2805,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2792\/revisions\/2805"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2792"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}