Standard Portable Library - hat die schonmal jemand benutzt?


  • Administrator

    Shade Of Mine schrieb:

    und muss man beten dass der compiler rvo/nrvo anwenden kann...

    Wobei heutzutage die meisten Kompiler dies unterstützen.

    Shade Of Mine schrieb:

    doch. das befüllen von containern ist in c++ deutlich langsamer als in java. (von den ganzen anderen copy situationen mal abgesehen).

    1. Ich wollte aber darauf hinaus, dass es ein schlechtes Beispiel ist, weil es eben deutlich schlimmere Kopieprobleme gibt. Also eben die anderen Situationen, welche du hier alle ausschliesst. 😃
    2. Und ob es in C++ wirklich deutlicher langsamer als in Java ist, weiss ich nicht. So ein Testbericht würde ich aber gerne mal sehen. Es ändert meine Meinung dazu aber nicht, push_back wird wahrscheinlich das kleinere Problem sein und eben nicht zu "poor performance" führen.

    Grüssli



  • Dravere schrieb:

    Shade Of Mine schrieb:

    und muss man beten dass der compiler rvo/nrvo anwenden kann...

    Wobei heutzutage die meisten Kompiler dies unterstützen.

    anwenden können != unterstützen



  • Kann mir mal schnell einer zusammen fassen, was mich daran hindert, einfach Containern von Pointern zu benutzen, wenn ich nichts kopieren will?



  • maximAL schrieb:

    Kann mir mal schnell einer zusammen fassen, was mich daran hindert, einfach Containern von Pointern zu benutzen, wenn ich nichts kopieren will?

    Nichts. Pass einfach auf dass zu jedem new/new[] ein delete/delete[] geschrieben steht.

    Simon



  • theta schrieb:

    maximAL schrieb:

    Kann mir mal schnell einer zusammen fassen, was mich daran hindert, einfach Containern von Pointern zu benutzen, wenn ich nichts kopieren will?

    Nichts. Pass einfach auf dass zu jedem new/new[] ein delete/delete[] geschrieben steht.

    Simon

    Smartpointer beheben das new/delete-Problem. Allerdings wirst du eigene Comparatoren schreiben müssen.



  • maximAL schrieb:

    Kann mir mal schnell einer zusammen fassen, was mich daran hindert, einfach Containern von Pointern zu benutzen, wenn ich nichts kopieren will?

    Du verlierst Performance durch keine cache lokalitaet und indirekte zugriffe. noch dazu musst du am free store allokieren und nicht am stack.



  • Shade Of Mine schrieb:

    maximAL schrieb:

    Kann mir mal schnell einer zusammen fassen, was mich daran hindert, einfach Containern von Pointern zu benutzen, wenn ich nichts kopieren will?

    Du verlierst Performance durch keine cache lokalitaet und indirekte zugriffe. noch dazu musst du am free store allokieren und nicht am stack.

    Wenn ich beispielsweise einen std::vector<std::string> definiere, dann verwaltet der std::string intern einen Zeiger auf den Heap und schon ist meine cache lokalität nicht vorhanden. Das entspricht also dem Verhalten von Containern von Zeigern.

    Habe ich eine Klasse, die keine Zeiger hat, also so etwas wie PODs, sind diese billig kopierbar und damit gibt es keinen Grund, im Container Zeiger darauf zu halten. Damit habe ich cache Lokalität.

    Unter C++ hat man halt die Wahl (oder auch Qual der Wahl).



  • Wenn ich beispielsweise einen std::vectorstd::string definiere, dann verwaltet der std::string intern einen Zeiger auf den Heap und schon ist meine cache lokalität nicht vorhanden. Das entspricht also dem Verhalten von Containern von Zeigern.

    Kommt (bei den meisten impl.) auf die länge des Strings an ob Stack oder Heap. 😃

    Simon



  • tntnet schrieb:

    Wenn ich beispielsweise einen std::vector<std::string> definiere, dann verwaltet der std::string intern einen Zeiger auf den Heap und schon ist meine cache lokalität nicht vorhanden. Das entspricht also dem Verhalten von Containern von Zeigern.

    small string optimization zB 😉
    aber worum es geht ist dass zB size() ja kein cache miss ist. du also nicht zwangsläufig schlechte cache lokalitaet hast. dass es natürlich vorkommt ist klar.



  • Den Kritikpunkt mit der "unnötigen" Kopie kann ich nicht nachvollziehen - man kann sich's ja eben in C++ genau aussuchen, ob man lieber Pointer oder Objekte kopiert. Die Container sind für einfache, leicht und korrekt zu kopierende Elemente designed. Wenn std::string das nicht erfüllt, tut man eben keine std::string rein. Wenn man die Container gegen ihr Design verwendet, handelt man sich den Ärger ein und braucht sich nicht beschweren.

    In Java ist nichts billiger daran, etwas in einen Container zu tun, man hat nur keine Wahl mehr, was man genau reintut.

    Falls ihr auf der Suche nach "pointer-friendly" containern seid, dann bietet sich übrigens boost.ptr_container an.



  • freestore vs stack 😕

    c++ 101 eigentlich...

    wenn wenigstens ein hinweis auf intrusive container gekommen wäre. aber nur weil man probleme wegdiskutiert lösen sie sich nicht auf.



  • Shade Of Mine schrieb:

    freestore vs stack 😕

    c++ 101 eigentlich...

    wenn wenigstens ein hinweis auf intrusive container gekommen wäre. aber nur weil man probleme wegdiskutiert lösen sie sich nicht auf.

    Was willst du sagen?


Anmelden zum Antworten