C++ Templates und virtuelle Methoden

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von Helmut »

dot hat geschrieben:
Top-OR hat geschrieben:3) Lieber die fertigen Container verwenden sollte?
Es geht nur darum, dass die fertigen Container nicht ohne Grund eben kein gemeinsames Interface für sequentielle und assoziative Container haben. Eben genau weil das keinen Sinn macht... ;)
Es macht schon Sinn und Top-OR hat im Grunde mit seiner Lösung die Standardbibliothek von Java nachprogrammiert. Das Problem ist, dass der Geschwindigkeitsverlust durch die Polymorphie nicht zu unterschätzen ist. Im besten Fall hat man mit der Lösung pro iteriertem Element einen vtable call, in der Praxis also einen Chachemiss. Da CPUs heutzutage im Wesentlichen den Flaschenhals im Speicherzugriff haben, hat das im Endeffekt die Folge, dass sich die Geschwindigkeit in der Iteration mindestens halbiert. Zusätzlich hat der Compiler auch in der Praxis keine Chance, da etwas zu inlinen.

Das ist auch mMn der Hauptgrund, weshalb Javaprogramme so langsam sind.
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von Top-OR »

dot hat geschrieben:Per Index auf Hashmaps oder Dachbodenschränke zugreifen ist sinnlos
Das glaube ich nicht, Tim. Für mich ist das eine fachliche Entscheidung, das zumindest tun zu können. Natürlich muss man sich über die Rahmenbedingungen (Performance, Konstanz in welchem Kontext, Reproduzierbarkeit) im Klaren sein.

Wiederholtes Iterieren und das damit assoziierbare Verknüpfen der Iterations-Ergebnisse mit numerischen Indices finde ich jetzt nicht so arg auseinander.
Wo in einer Menge (z.B. mit den Elementen "rot", "grün" und "blau") ist denn der "begin()"? Ist DAS fachlich eleganter/sinnvoller? Echt jetzt?

Für mich ist es nicht sinnlos, ist aber zugegeben ein Edge-Case und die sich ergebenden (willkürlichen) (Halb-)Ordnungen haben natürlich keine "allgemeingültige fachliche Eleganz", sind aber vorhanden, konstant, reproduzierbar und ich kann mich mit ihnen abfinden.

Wenn ich eine Hashmap benutze, dann ja, weil ich PRIMÄR schnelles Auflösen von Keys ind die Values brauche und nicht, weil ich den ganzen Tag per Index drüber iterieren oder per Index "random accessen" möchte (und wenn, dann nur in bestimmten Fällen). Sollte eigentlich klar sein...

Entstanden ist die Idee mit dem Index vor ein paar Jahren, wo ich beruflich mehr mit Perl und PHP unterwegs war. Ich glaube, in Javascript geht das auch. Weiß nicht mehr so genau...

Der Behauptung, dass das "sinnlos" ist, schließe ich mich daher nicht an. Ob es "gutes" C++ im Sinne der kaiserlichen Tradition ist, ist mir wieder egal, wenn es "valide und nicht mehrdeutig" ist.

Der Grund, warum ich dann doch nach "Best Practices" frage, ist, da ich verstehen möchte, warum manche "Verallgemeinerten Do's and Dont's" so sind, wie sie sind. Oft hat das praktische und komplexe Gründe, die eben in verallgemeinerten einfachen Regeln münden, um sie greifbarer zu machen.

Und so schaue ich eben mal genau nach, um eben am Ende besser abzuwägen, was die Konsequenzen sind, falls ich sie ignoriere... ;-) Trading eben.

dot hat geschrieben:exactly
Spiele Programmierer hat geschrieben:Für diesen Zweck würde ich dir eine einfache "array_view" Klasse nahelegen.
Darüber würde ich gerne mehr reden. Deswegen danke nochmal für den Hinweis zum Konzept "array_view" und dessen korrekte Benutzung...
Ich lasse mich da mal inspirieren.
Spiele Programmierer hat geschrieben:Das in solche virtuellen Schnittstellen zu zwängen, halte ich trotzdem für sehr unsinnig.
Wie gesagt - Danke für den Denkanstoß. Ich lasse mir mal durch den Kopf gehen...
Zuletzt geändert von Top-OR am 05.08.2016, 17:59, insgesamt 4-mal geändert.
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von dot »

Helmut hat geschrieben:
dot hat geschrieben:
Top-OR hat geschrieben:3) Lieber die fertigen Container verwenden sollte?
Es geht nur darum, dass die fertigen Container nicht ohne Grund eben kein gemeinsames Interface für sequentielle und assoziative Container haben. Eben genau weil das keinen Sinn macht... ;)
Es macht schon Sinn und Top-OR hat im Grunde mit seiner Lösung die Standardbibliothek von Java nachprogrammiert.
Nö, die Java Standardbibliothek macht genauso einen Unterschied zwischen sequentiellen und assoziativen Containern...
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von dot »

Top-OR hat geschrieben:Wiederholtes Iterieren und das damit assoziierbare Verknüpfen der Iterations-Ergebnisse mit numerischen Indices finde ich jetzt nicht so arg auseinander.
Doch, denn das Konzept "iterieren" und das Konzept "Index" haben nichts miteinander zu tun. Ein Index markiert die Stelle an der ein Objekt in einer Sequenz anzufinden ist. Gibt es keine Sequenz, gibt es keinen Index. Iterieren kann ich ganz abstrakt auch über Mengen von Objekten, denen keine sequentielle Struktur zugrunde liegt, beim Konzept der Iteration über eine Collection geht es nur darum, jedes Element einmal zu besuchen, ganz egal in welcher Reihenfolge dies passiert. Ich kann auch parallel iterieren, in diesem Fall gibt es dann selbst eine dem Vorgang der Iteration an sich anhaftende Reihenfolge nicht mehr...
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von Top-OR »

dot hat geschrieben:
Top-OR hat geschrieben:Wiederholtes Iterieren und das damit assoziierbare Verknüpfen der Iterations-Ergebnisse mit numerischen Indices finde ich jetzt nicht so arg auseinander.
Doch, denn das Konzept "iterieren" und das Konzept "Index" haben nichts miteinander zu tun. Ein Index ist markiert die Stelle an der ein Objekt in einer Sequenz anzufinden ist. Gibt es keine Sequenz, gibt es keinen Index. Iterieren kann ich auch über Mengen von Objekten, denen keine sequentielle Struktur zugrunde liegt, beim Konzept der Iteration über eine Collection geht es nur darum, jedes Element einmal zu besuchen.
Aber während des Herausholens erzeugst du eine Sequentialität, die du dann auch mal nummerieren könntest...
Du holst das "erste" heraus, das nennst du 0.
Du holst das "zweite" heraus, das nennst du 1.
...

Das das nicht auf Gedeih und Verderb per Natur-, mathematischem und logischem Gesetz miteinander verknüpft ist, ist mir klar, aber es liegt (mir) nahe.
--
Verallgemeinerungen sind IMMER falsch.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von dot »

Top-OR hat geschrieben:
dot hat geschrieben:
Top-OR hat geschrieben:Wiederholtes Iterieren und das damit assoziierbare Verknüpfen der Iterations-Ergebnisse mit numerischen Indices finde ich jetzt nicht so arg auseinander.
Doch, denn das Konzept "iterieren" und das Konzept "Index" haben nichts miteinander zu tun. Ein Index ist markiert die Stelle an der ein Objekt in einer Sequenz anzufinden ist. Gibt es keine Sequenz, gibt es keinen Index. Iterieren kann ich auch über Mengen von Objekten, denen keine sequentielle Struktur zugrunde liegt, beim Konzept der Iteration über eine Collection geht es nur darum, jedes Element einmal zu besuchen.
Aber während des Herausholens erzeugst du eine Sequentialität, die du dann auch mal nummerieren könntest...
Du holst das "erste" heraus, das nennst du 0.
Du holst das "zweite" heraus, das nennst du 1.
...

Das das nicht auf Gedeih und Verderb per Natur-, mathematischem und logischem Gesetz miteinander verknüpft ist, ist mir klar, aber es liegt (mir) nahe.
dot hat geschrieben:Ich kann auch parallel iterieren, in diesem Fall gibt es dann selbst eine dem Vorgang der Iteration an sich anhaftende Reihenfolge nicht mehr...
Durch einführen solcher willkürlichen Abhängigkeiten schränkst du infolge der daraus resultierenden Vermischung der dahinterstehenden Konzepte die Mächtigkeit deiner Abstraktion völlig unnötig ein... ;)
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: C++ Templates und virtuelle Methoden

Beitrag von Top-OR »

dot hat geschrieben:Ich kann auch parallel iterieren, in diesem Fall gibt es dann selbst eine dem Vorgang der Iteration an sich anhaftende Reihenfolge nicht mehr...
Wenn es nur lesend ist, sehe ich kein Problem. Aber selbst das kann ich bisher in der Codebase von ~80.000 Zeilen ausschließen.
dot hat geschrieben:Durch aufzwingen solcher willkürlichen Abhängigkeiten und vermischen der dahinterstehenden Konzepte, schränkst du deine Abstraktionen völlig unnötig ein... ;)
Damit kommen wir der Sache schon Näher. Ich möchte auch keine akademische Diskussion hier.
Ich denke, wir stimmen überein, dass es nicht die beste Möglichkeit der Welt ist, an die Elemente zu kommen, aber ich habe zumindest Fälle, wo es "irgendwie schön ist", abstrakt per Zahl zu indizieren. Im Gegensatz zu den Möglichkeiten, Parallel zu "index/random accessen" (was bisher nicht gemacht wird): Wenn einer wirklich per numerischem Index zugreifen muss, macht er das alleine und bitte auch nicht so oft. Die Performance... ihr wisst.

Am Ende reden wir hier nicht über die "alleinige Möglichkeit", an die Elemente zu kommen, sondern über einen Edge-Case. (dachte, das käme rüber)
Wenn ein "Konsument weiß", dass es z.B. eine Hashmap ist, kann auch offiziell ohne numerischen Index schnell gehashmapped werden.

Achso: Ursprünglich gings mir auch eher mal darum, die Interfaces von Listen und Arrays und anderem "linearen" Krams zu harmonisieren. Das ich das auch den Hashmaps aufgedrückt habe, ist eher ein Seiteneffekt. ;-)
--
Verallgemeinerungen sind IMMER falsch.
Antworten