schönes c++?
-
> Mich würde wirklich mal interessieren, was du gesagt hast.
Nichts, was mit fricky mithalten könnte.
Ich erinnere mich dunkel, er meinte, dass "C++ für Exceptions zu kompliziert sei" oder so. Hab's mir leider nicht gemerkt.
-
Ad aCTa schrieb:
Nichts, was mit fricky mithalten könnte.
Ich erinnere mich dunkel, er meinte, dass "C++ für Exceptions zu kompliziert sei" oder so. Hab's mir leider nicht gemerkt.Interessant. Ja, war auch meine Vermutung im anderen Thread. Naja, so muss man sich nicht gerade wundern.
-
musiknase schrieb:
Vielleicht kennt ihr tolle Artikel im Netz, die über solche "Best Practices" informieren?
die wichtigsten best practices wären etwa diese hier: http://yosefk.com/c++fqa/why.html
-
Nexus schrieb:
avrül schrieb:
Und Vorsicht, Exception safety und copy assignment operator sind schlimmstes C++ Bashing und wird sofort von volkard gelöscht.
Mich würde wirklich mal interessieren, was du gesagt hast.
Exceptionsicherheit ist in der Tat kein triviales Unterfangen, durch RAII kann allerdings viel vereinfacht werden. Sie besteht aber nicht nur aus korrektem Freigeben, je nach Situation soll beispielsweise ein Rollback durchgeführt werden oder ein Status konsistent gehalten werden. Mit dieser Gegebenheit muss man sich übrigens nicht nur in C++ beschäftigen.Und in C++ hast du eben einige Sachen mehr die man schnell falsch macht, die es aber sonst in (fast) keiner Sprache gibt, z.B. copy assignment operator.
Und auf
hustbaer schrieb:
avrül schrieb:
Exceptions in c++ sind zu kompliziert
was hättest du denn gern einfacher?
Hab ich sowas ähnliches geantwortet: Man müsste wohl eher sagen, C++ ist zu kompliziert für Exceptions. Man muss sich nur mal anschauen, was alles über Exception safety und copy assignment operator geschrieben wurde.
-
Na und? Low-Level tut immer an mancher Stelle etwas weh, C++ ist lowlevel ----> C++ kann manchmal wehtun, musss es aber nicht. Es hindert dich niemand daran, Exception-Safety-Probleme zu abstrahieren (RAII/pImpl/Exceptionfree swap), das macht die Sprache eben attraktiv. (:
-
Ad aCTa schrieb:
...Exceptionfree swap
was ist denn damit gemeint?
-
;fricky schrieb:
Ad aCTa schrieb:
...Exceptionfree swap
was ist denn damit gemeint?
wenns dich wirklich interessiert, dann suchs dir doch selber raus. da du dich aber garnicht für c++ interessierst, könntest du auch einfach aufhören in c++ threads rumzutrollen.
-
hustbaer schrieb:
;fricky schrieb:
Ad aCTa schrieb:
...Exceptionfree swap
was ist denn damit gemeint?
wenns dich wirklich interessiert, dann suchs dir doch selber raus.
hab ich versucht. eigentlich bin ich ein meister im googlen, aber irgendwie finde ich den begriff nicht.
-
@;fricky
"Exception safe swap"
oder
"non-throwing swap"
ist damit gemeint@avrül
Exception-safety ist in (fast) allen Sprachen mit Exceptions ein Problem. Nur wird es da eben oft ignoriert.(Persönlich verstehe ich eh nicht, warum die ganzen modernen Skriptsprachen nicht das Exceptionsystem aus Common Lisp kopieren. Da kann man bei jeder Condition, nämlich mögliche Restarts definieren.)
-
;fricky schrieb:
eigentlich bin ich ein meister im googlen, aber irgendwie finde ich den begriff nicht.
gemeint ist wohl das, was im fünften von "c++ Exception free swap" angesprochen wird.
http://forums.devarticles.com/c-c-help-52/using-swap-to-make-assignment-operator-exception-safe-131249.html?p=178923http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-and-swap
Und jetzt kommts endlich.
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-throwing_swap
-
@volkard
oh, More C++ Idioms schaut eh sehr interessant aus. Danke für den Link
-
rüdiger schrieb:
@avrül
Exception-safety ist in (fast) allen Sprachen mit Exceptions ein Problem. Nur wird es da eben oft ignoriert.In (fast) allen anderen Sprachen kann man keine copy assignment operatoren überschreiben, also schon mal eine Fehlerquelle weniger. Die meisten anderen Sprachen die Exceptions haben, haben auch einen GC und damit muss man schon mal nicht darüber nachdenken, ob man auch bei ner Exception allen Speicher wieder frei gibt. Und ja, ich weiß, in C++ haben wir doch auto und shared und smart und weak und ... pointer für sowas und das ist doch die Kompl... äähh Schönheit von c++ das wir uns immer wieder den passenden Pointer aussuchen könnten ...
-
rüdi, volkard: danke, das hätte ich allein nie gefunden.
wenn ich's richtig verstanden habe, will man mit solchen verrenkungen verhindern, dass eine swap-funktion einem die objekte zersemmelt, wenn sie durch eine exception abbricht. klingt für mich nach einem der typischen c++ workarounds, also nichts, was allgemeingültigkeit hat (hätte ja sein können).
-
nachtrag: warum nicht etwa so?
void swap (object *a, object *b) { char *p = (char*)a; char *q = (char*)b; int s; for (s=0; s<izeof(object); s++) { p[s] = p[s] ^ q[s]; q[s] = p[s] ^ q[s]; p[s] = p[s] ^ q[s]; } }
^^XOR-swap, dürfte keine exception triggern, weil z.b. kein temporärer speicher alloziert werden muss.
-
;fricky schrieb:
nachtrag: warum nicht etwa so?
void swap (object *a, object *b) { char *p = (char*)a; char *q = (char*)b; int s; for (s=0; s<izeof(object); s++) { p[s] = p[s] ^ q[s]; q[s] = p[s] ^ q[s]; p[s] = p[s] ^ q[s]; } }
^^XOR-swap, dürfte keine exception triggern, weil z.b. kein temporärer speicher alloziert werden muss.
weils langsam ist.
-
Wie kommt man bloß immer auf die Idee, Smart Pointer seien ein GC?
> und das ist doch die Kompl... äähh Schönheit von c++ das wir uns immer wieder den passenden Pointer aussuchen könnten ...
Wenn du zu faul bist, kannst du ruhig permanent den shared pointer nehmen. Schaden wird es dir nicht.
> Die meisten anderen Sprachen die Exceptions haben, haben auch einen GC und damit muss man schon mal nicht darüber nachdenken, ob man auch bei ner Exception allen Speicher wieder frei gibt.
Wieso sollte bei einer Exception der ganze Speicher freigegeben werden? Das hat Erläuterungsbedarf. (Oder lieber doch nicht, das bringt nur weiteres Getrolle)
Es geht bei Exception safety nicht nur um Speicherlecks. z.B. eine fehlerhafte Datenbankänderung oder ein inkonsistenter Zustand, was nicht nur Speicherleichen, zerdonnerte Streams usw. sein müssen, sondern auch logische Inkonsistenz, die es in jeder Sprache gibt. Informiere dich mal - sofern es dich interessiert - über Ausnahmegarantien (Effective C++).> dass eine swap-funktion einem die objekte zersemmelt, wenn sie durch eine exception abbricht. klingt für mich nach einem der typischen c++ workarounds, also nichts, was allgemeingültigkeit hat (hätte ja sein können).
Es geht - wie gesagt - nicht immer nur um zersemmelten Speicher, sondern unerwünschten/unbekannten Zuständen nach einer Exception. Was passiert, wenn das Auswechseln eines Bitmaps scheiterte? Soll das alte angezeigt werden? Soll ein Default angezeigt werden?
Exceptionsicheres Swap mag C++artig sein. Andere Sprachen haben andere Mittel.C#-Exception-safety: http://research.microsoft.com/en-us/projects/specsharp/krml135.pdf
-
;fricky schrieb:
wenn ich's richtig verstanden habe, will man mit solchen verrenkungen verhindern, dass eine swap-funktion einem die objekte zersemmelt, wenn sie durch eine exception abbricht.
mehr. das mußt du eigentlich in einem größeren kontext sehen.
ums dir einfacher zu machen, schau, wie ein schnelles swap implementiert ist, und tu es so aus geschwindigkeitsgründen.
warum es sowas in c nicht gibt: weil es da keine templates gibt und keiner eine default-implementierung für swap schreiben könnte, die per dreieckstausch tauscht. da muß man grundsätzlich für jeden neuen typ ein neues swap schreiben. helau. warum es sowas in java nicht gibt: weil es in java nichtmal möglich ist, eine swap-funktion zu bauen.
-
volkard schrieb:
;fricky schrieb:
^^XOR-swap, dürfte keine exception triggern, weil z.b. kein temporärer speicher alloziert werden muss.
weils langsam ist.
relativ langsam, dafür aber ziemlich zuverlässig. man kann manchmal nicht alles haben.
Ad aCTa schrieb:
Es geht - wie gesagt - nicht immer nur um zersemmelten Speicher, sondern unerwünschten/unbekannten Zuständen nach einer Exception. Was passiert, wenn das Auswechseln eines Bitmaps scheiterte? Soll das alte angezeigt werden? Soll ein Default angezeigt werden?
wenn's wirklich wichtig ist, dass sowas nie schiefgeht, dann sollte man bedingungen schaffen, die ein scheitern nahezu unmöglich machen. mit dynamischem speicher haste natürlich immer das risiko des misslingens. deswegen z.b. ein XOR-swap.
volkard schrieb:
das mußt du eigentlich in einem größeren kontext sehen.
ich sehe diesen kontext als unnötig komplexes, eigenwilliges system, von dem man glaubt, sich immer wieder damit arrangieren zu müssen, weils vielleicht in einigen ganz wenigen punkten vorteile hat.
volkard schrieb:
ums dir einfacher zu machen, schau, wie ein schnelles swap implementiert ist, und tu es so aus geschwindigkeitsgründen.
zur laufzeit, würde ich sagen, geht nichts über drei 'memcpys'.
volkard schrieb:
warum es sowas in c nicht gibt: weil es da keine templates gibt und keiner eine default-implementierung für swap schreiben könnte, die per dreieckstausch tauscht. da muß man grundsätzlich für jeden neuen typ ein neues swap schreiben. helau.
in C kann man eine funktion oder ein makro für'n dreieckstausch basteln, der müsste man zwei pointer und die grösse der objekte mitgeben. das sollte eigentlich klappen. oder man swappt einfach zwei pointer, aber das ist ja nicht dasselbe.
volkard schrieb:
weil es in java nichtmal möglich ist, eine swap-funktion zu bauen.
doch klar. natürlich keine, die im speicher zweier Java-objekte rumwurschtelt, aber mit arrays und einfachen typen geht das schon.
-
;fricky schrieb:
doch klar. natürlich keine, die im speicher zweier Java-objekte rumwurschtelt, aber mit arrays und einfachen typen geht das schon.
mach mal und zeig mal.
-
Nanyuki schrieb:
Ja, ich habe mich etwas unglücklich ausgedrückt. Wenn ich mir so meinen Code anschaue, dann wandern viele mit new erzeugte Objekte sofort in einen Container, der sich fortan um die Speicherverwaltung kümmert. [...]
Ich wuerde dein Design nochmal ueberpruefen. Immer die Regel beachten, wer den Speicher anfordert ist auch fuer ihn zustaendig. Wieso koennen deine Container nicht die Objekte selbst erzeugen?