C++ Bibliotheken im Umfang wie Java?



  • Nexus schrieb:

    Stell dir einen String vor, der als verkettete Liste programmiert ist. Du kannst nun wahnsinnig einfach und performant sämtliche Vorkommen eines Teilstrings durch einen anderen ersetzen.

    Dafür deutlich mehr (>2x) Speicherverbrauch. Denn zu jedem char muss man noch nen pointer auf den nächsten speichern. Und wenn man nicht massive Performance-Probleme bekommen will, wenn man von hinten durch den String iteriert, muss man noch nen zweiten Pointer auf das vorherige Element speichern. wohlgemerkt, pro char!



  • CHARming schrieb:

    Dafür deutlich mehr (>2x) Speicherverbrauch. Denn zu jedem char muss man noch nen pointer auf den nächsten speichern. Und wenn man nicht massive Performance-Probleme bekommen will, wenn man von hinten durch den String iteriert, muss man noch nen zweiten Pointer auf das vorherige Element speichern. wohlgemerkt, pro char!

    Ja, das ist eben der Preis. Für die meisten Fälle lohnt es sich wohl nicht und ein dynamisches Array eignet sich am besten. Das heisst ja nicht, dass es nicht auch manchmal anders sein kann. Zudem gibt es ja noch std::deque als Zwischenlösung.



  • DStefan schrieb:

    Z.B. müsste man für c_str() den String kopieren. Wohin?

    class KasFString
    {
            vector<char> stringdata;
        public:
            const char* c_str() const { return &stringdata[0]; }
    };
    

    Wo liegt das Problem dabei ?



  • pumuckl schrieb:

    Nexus schrieb:

    Ich denke mal, es wäre noch interessant gewesen, std::string mehr als Adapter denn als eigener Container zu konzipieren. Als normalerweise unterliegenden Container könnte man std::vector nehmen, momentan ähnelt std::string dem sowieso ziemlich. Aber zum Beispiel wenn man eine grössere Datei in einen String einlesen will, würde sich die Datenstruktur von std::deque wohl besser eignen. So wäre man diesbezüglich etwas flexibler und nicht an ein dynamisches Array gebunden.

    Klingt nach einem interessanten Ansatz, mit dem man mal etwas rumexperimentieren könnte *notier*.

    Ich experimentiere derzeit damit herum. Soll mal ein Webserver werden. Socket liest in eine Queue<char>. Strings wird es so gar nicht geben, nur Container (Ranges, die ihre Elemente besitzen) und Ranges(, die ihre Elemente nicht be4sitzen). Bis eine Anfrage abgearbeitet ist, wird einfach in der Queue der Speicher nicht gepoppt, womit alle "Strings" ohne Kopieren auskommen, bis am Ende zu send(), was dann kopieren darf, wenn der Speicher in zu kleinen Happen rumliegt und sendfile(), was kopieren muß, wenn der Dateiname zufällig auf zwei Seiten verteilt ist (beides dürfte eher selten vorkommen). Bin noch gar nicht weit, aber der Ansatz fühlt sich GUT an.



  • KasF schrieb:

    DStefan schrieb:

    Z.B. müsste man für c_str() den String kopieren. Wohin?

    class KasFString
    {
            vector<char> stringdata;
        public:
            const char* c_str() const { return &stringdata[0]; }
    };
    

    Wo liegt das Problem dabei ?

    Lies mal Nexus' Posting. Er wollte gerade nicht den String als dynamisches Array repräsentiert haben.

    Stefan.



  • DStefan schrieb:

    Lies mal Nexus' Posting. Er wollte gerade nicht den String als dynamisches Array repräsentiert haben.

    Ok, danke.



  • @DStefan
    ich denke unter "dynamischem array" verstehen die meisten ein auf dem heap angelegtes array (new[]) und kein std::vector / std::deque / ....

    Simon



  • theta schrieb:

    @DStefan
    ich denke unter "dynamischem array" verstehen die meisten ein auf dem heap angelegtes array (new[]) und kein std::vector / std::deque / ....

    Simon

    Aber genau das macht std::vector doch. Vielleicht sollte man "verwaltetes dynamisches Array" sagen?

    Stefan.



  • Damit keine Missverständnisse entstehen: Ich habe mich auf die internen Datenstrukturen der Container bezogen. Also

    • dynamisches Array bei std::vector
    • mehrere dynamische Arrays bei std::deque
    • doppelt verkettete Liste bei std::list

    Was die Strings betrifft, so könnte man auch abgesehen von der internen Datenstruktur gewisse Dinge ausprobieren. Wahrscheinlich gibt es einige Optimierungen, was das Kopierverhalten betrifft (ich weiss ja nicht, wie gut COW immer umgesetzt ist). Z.B. sowas wie shared_string . Oder ein String, der noch kompatibler zu C ist und sich zum Beispiel auch in den Speicher schreiben lässt. Man müsste dann halt eine Lösung finden, um die Invarianten sicherstellen (Position der Nullterminierung).

    Dazu habe ich eigentlich nichts Konkretes, das sollten nur mal ein paar spontane, in den Raum geworfene Ideen sein. Ich kann mir vorstellen, dass zumindest das Herumexperimentieren ab und zu recht interessant sein kann... 🙂



  • Nexus schrieb:

    Dazu habe ich eigentlich nichts Konkretes, das sollten nur mal ein paar spontane, in den Raum geworfene Ideen sein. Ich kann mir vorstellen, dass zumindest das Herumexperimentieren ab und zu recht interessant sein kann... 🙂

    Es wird sich verdammt viel ändern, schätze ich. Ein Iterator ist was, was sich wie ein Zeiger anfühlt. Ein String ist was, was sich wie ein container of char anfühlt. Und das ist erst der Anfang, in Wirklichkeit ist es viel einfacher, wenn man die Schwelle überspringt, aber viel komplizierter für uns. Zufällig kommt c++0x zeitgleich mit dem Vulkanausbruch, daß die stl weitgehend verstanden ist und sich überlegene Begriffe auftun(, die noch weitgehend unverstanden sind). Es wird ein ganz fetter Bums kommen. C++ wird keine einheitliche Gemeinde mehr sein (falls sie das jemals war). Es wird viele Neusachen-Ablehner geben, viel mehr als beim alten Standard oder boost, es wird viele Abspringer geben, die "es einfach nicht mehr einsehen".
    Wir werden in interessanten Zeiten leben.



  • volkard schrieb:

    Wir werden in interessanten Zeiten leben.

    Hinzu kommen noch interessante Vorschläge, wie von den Iteratoren abzukehren und sich auf Ranges zu besinnen. Auch dies würde C++ im Kern ein weiteres mal umkrempeln, wenn so die Monopole der funktionalen Sprachen gestürmt werden: Lazy Evaluation und unendliche Datenstrukturen. Ein Ausflug nach Haskell hat mir erst gezeigt, wie einfach man zum Beispiel das Auslesen aus einer Datei machen kann: Als Liste von Zeilen die über Lazy evaluation dynamisch beschafft werden, wenn sie gebraucht werden.

    Mit dem Neuen Standard ist C++ mächtig genug um das ganze Repertoire funktionaler Programmierung einfach und effizient abzubilden. Und ich denke, diese Chance sollte man nutzen.



  • volkard schrieb:

    Es wird sich verdammt viel ändern, schätze ich. Ein Iterator ist was, was sich wie ein Zeiger anfühlt. Ein String ist was, was sich wie ein container of char anfühlt. Und das ist erst der Anfang, in Wirklichkeit ist es viel einfacher, wenn man die Schwelle überspringt, aber viel komplizierter für uns. Zufällig kommt c++0x zeitgleich mit dem Vulkanausbruch, daß die stl weitgehend verstanden ist und sich überlegene Begriffe auftun(, die noch weitgehend unverstanden sind). Es wird ein ganz fetter Bums kommen. C++ wird keine einheitliche Gemeinde mehr sein (falls sie das jemals war). Es wird viele Neusachen-Ablehner geben, viel mehr als beim alten Standard oder boost, es wird viele Abspringer geben, die "es einfach nicht mehr einsehen".
    Wir werden in interessanten Zeiten leben.

    Das sehe ich ähnlich. Und ich befürchte, dass die Anzahl der Ablehner, vor allem im kommerziellen Bereich, ziemlich groß sein wird. C++, inklusive der Standard-Bibliotheken, drängt sich eigentlich in keinem relevanten Bereich der Programmier-Szene wirklich auf als die Sprache der Wahl. Und daran wird sich - leider - auch mit dem neuen Standard vermutlich nichts ändern.

    Versteht mich nicht falsch: Ich liebe C++. Aus vielen Gründen. Aber ich bin der Meinung, dass sich Standard-C++ leider in die völlig falsche Richtung bewegt. Die Sprache wird in Zukunft mehr und mehr an Relevant einbüßen. Fürchte ich.

    Stefan.



  • otze schrieb:

    Ein Ausflug nach Haskell hat mir erst gezeigt, wie einfach man zum Beispiel das Auslesen aus einer Datei machen kann: Als Liste von Zeilen die über Lazy evaluation dynamisch beschafft werden, wenn sie gebraucht werden.
    Mit dem Neuen Standard ist C++ mächtig genug um das ganze Repertoire funktionaler Programmierung einfach und effizient abzubilden. Und ich denke, diese Chance sollte man nutzen.

    "Als Liste von Zeilen die über Lazy evaluation dynamisch beschafft werden, wenn sie gebraucht werden." konnten wir mit ranges schon seit 10 Jahren, nur wußten wir es vor heuer nicht, es ist zum heulen.
    foreach (mit häßlichen dreistufigen for-makros) konnten wir schon seit zehn jahren, nur wußten wir es vor heuer nicht, es ist zum heulen.



  • @DStefan
    Wieso meinst du, dass kein Bedarf da ist?

    Also es gibt ja gewissen Bedarf an solchen Techniken. Microsoft, Adobe und wahrscheinlich viele andere benutzen ja die Loki Bibliothek, welche ein paar solche Techniken benutzt, wie sie mit C++0x kommen..

    btw.
    Mir ist was komisches aufgefallen. Warum sind die news auf der Loki page älter, als die von 2007?!

    "Neu":
    http://loki-lib.sourceforge.net/index.php?n=Main.News

    "Alt":
    http://web.archive.org/web/20071021090321/http://loki-lib.sourceforge.net/index.php?n=Main.News



  • drakon schrieb:

    btw.
    Mir ist was komisches aufgefallen. Warum sind die news auf der Loki page älter, als die von 2007?!

    "Neu":
    http://loki-lib.sourceforge.net/index.php?n=Main.News

    "Alt":
    http://web.archive.org/web/20071021090321/http://loki-lib.sourceforge.net/index.php?n=Main.News

    Weil er zu einem großen Wurf ausholt. Und gedacht hatte, das schon längst geworfen zu haben, aber MIST, es dauert doch ein Momentchen länger.
    ?



  • drakon schrieb:

    @DStefan
    Wieso meinst du, dass kein Bedarf da ist?

    Also es gibt ja gewissen Bedarf an solchen Techniken. Microsoft, Adobe und wahrscheinlich viele andere benutzen ja die Loki Bibliothek, welche ein paar solche Techniken benutzt, wie sie mit C++0x kommen..

    Ach, ich meine gar nicht, dass kein Bedarf für C++0x besteht. Ich meine, dass der Bedarf an anderen Dingen größer ist. Dass sich C++ am Markt (nicht unbedingt im kommerziellen Sinne) besser behaupten könnte, wenn diese Dinge beachtet würden. Zum Beispiel:

    - Umfassende Bibliotheksunterstützung für Dinge aus der Realen Welt. Wie sie ja auch in diesem Thread schon angefragt wurden.

    - Ein definiertes Name Mangling, so dass DLLs verschiedener Hersteller oder verschiedener Versionen desselben Herstellers problemlos verwendet werden können.

    - Konsequente und leicht zu verwendende Unterstützung für Unicode. Und zwar im Programm wie im Quelltext. Warum, zum Teufel, darf ich eine Klasse nicht Käsekuchen nennen - und dieser eine Methode [c]preisIn€()[c] verpassen?!

    Undsoweiter. Das sind bloß Dinge, die mir grad spontan so einfallen. Ich finde, das sind wichtige Dinge. Ja, ich würde so weit gehen zu sagen, dass mir allein schon diese drei Punkte wichtiger sind als alles, was der neue Standard bringen mag. -- Wobei ich freimütig zugebe, dass ich wohl eher schlecht über die geplanten Neuerungen informiert bin 😉

    Stefan.



  • DStefan schrieb:

    Das sehe ich ähnlich. Und ich befürchte, dass die Anzahl der Ablehner, vor allem im kommerziellen Bereich, ziemlich groß sein wird. C++, inklusive der Standard-Bibliotheken, drängt sich eigentlich in keinem relevanten Bereich der Programmier-Szene wirklich auf als die Sprache der Wahl. Und daran wird sich - leider - auch mit dem neuen Standard vermutlich nichts ändern.

    Versteht mich nicht falsch: Ich liebe C++. Aus vielen Gründen. Aber ich bin der Meinung, dass sich Standard-C++ leider in die völlig falsche Richtung bewegt. Die Sprache wird in Zukunft mehr und mehr an Relevant einbüßen. Fürchte ich.

    Stefan.

    Wie kommst Du darauf, dass C++ nicht die Sprache der Wahl ist? Du sitzt wahrscheinlich gerade vor einem Programm, welches mit C++ geschrieben ist. Welchen Browser nutzt Du? Firefox? IE? Safari? Konqueror? Egal - zumindest die sind in C++ geschrieben. Bei Java sieht man es halt auf dem ersten Blick. Wenn nicht an der Optik dann an der Dateiendung (oder der Langsamkeit 😉 🤡 ). Bei C++ sieht man es nicht. C++-Programme funktionieren halt einfach.

    Ich verdiene meinen Lebensunterhalt mit der Programmierung in C++. Die Ergebnisse sind überall sichtbar aber kaum einer weiß, dass da C++-Programme dahinter stehen.



  • DStefan schrieb:

    Ach, ich meine gar nicht, dass kein Bedarf für C++0x besteht. Ich meine, dass der Bedarf an anderen Dingen größer ist.

    Das tolle an C++ ist dass Du wirklich ALLES damit machen kannst. C++ kann schon verdammt viel, noch mehr wäre einfach übertrieben. Wenn dir irgendwas fehlt besorg dir einfach eine fertige Library oder programmier es dir selbst. Ausserdem, in welcher Programmersprache ausser C++ kann man Inline-Assembler einsetzen? Eg gibt vielleicht noch 3 oder 4, aber die meisten können es nicht.

    DStefan schrieb:

    - Umfassende Bibliotheksunterstützung für Dinge aus der Realen Welt. Wie sie ja auch in diesem Thread schon angefragt wurden.

    Wie gesagt, Bibliotheken für alles Mögliche findest du in mehrfacher Azsführung.

    DStefan schrieb:

    - Ein definiertes Name Mangling, so dass DLLs verschiedener Hersteller oder verschiedener Versionen desselben Herstellers problemlos verwendet werden können.

    DLLs haben doch schon festgelegte Formate, Wenn Du keine import-library hast, benutzt Du einfach LoadLibrary/GetProcAddress. Das ist alles kein Problem.

    DStefan schrieb:

    - Konsequente und leicht zu verwendende Unterstützung für Unicode. Und zwar im Programm wie im Quelltext. Warum, zum Teufel, darf ich eine Klasse nicht Käsekuchen nennen - und dieser eine Methode [c]preisIn€()[c] verpassen?!

    Fehlen Dir Umlaute wirklich? Ok, aber das ist Geschmacksache. Mich z.B. stören selbst umlaute und Leerzeichen in Dateinamen [ich bevorzuge mein_guete.txt statt Meine Güte . txt] 😋



  • general bacardi schrieb:

    DStefan schrieb:

    Ach, ich meine gar nicht, dass kein Bedarf für C++0x besteht. Ich meine, dass der Bedarf an anderen Dingen größer ist.

    Das tolle an C++ ist dass Du wirklich ALLES damit machen kannst. C++ kann schon verdammt viel, noch mehr wäre einfach übertrieben. Wenn dir irgendwas fehlt besorg dir einfach eine fertige Library oder programmier es dir selbst.

    Was willst Du uns damit sagen? Dass die Spracherweiterungen in C++0x übertrieben sind? Falls ja, frag mal die Boost-Entwickler, wie die das sehen. Rvalue Referenzen, Variadic Templates, decltype sind ziemlich geniale Erweiterungen, die die Entwicklung von Libraries erheblich verbessern und andere Dinge erst möglich machen (Ich freu' mich schon auf std::unique_ptr zB).



  • Sebastian Pizer schrieb:

    general bacardi schrieb:

    DStefan schrieb:

    Ach, ich meine gar nicht, dass kein Bedarf für C++0x besteht. Ich meine, dass der Bedarf an anderen Dingen größer ist.

    Das tolle an C++ ist dass Du wirklich ALLES damit machen kannst. C++ kann schon verdammt viel, noch mehr wäre einfach übertrieben. Wenn dir irgendwas fehlt besorg dir einfach eine fertige Library oder programmier es dir selbst.

    Was willst Du uns damit sagen? Dass die Spracherweiterungen in C++0x übertrieben sind?

    Nein, ich will damit sagen, dass Zusatzbibliotheken wenn man sie braucht, überall leicht erhältlich sind. Beispielsweise welche für Multithreading, grafische Oberflächen, Soundverarbeitung, netzwerkkommunikation usw, das alles muss man nicht in die SPrache integrieren. Was die neuen C++0x Feature angeht, so kann man sie benutzen oder auch nicht. So wie C++ schon immer benutzt wurde, daran wird sich nichts ändern. Jeder verwendet C++ nach seinem Geschmack und das finde ich gut. C++ bietet von allen Programmiersprachen die ich kenne die meiste Freiheit und die meisten Möglichkeiten. 🙂 👍


Anmelden zum Antworten