OT: Nickdiskussion
-
Artchi schrieb:
Wetten, das wenn man es dir erklären würde, du trotzdem mit der Antwort nicht einverstanden sein würdest, und wieder von dir ein C++-Flamewar los geht?
das hört sich ja so an, als wüsstest du die antwort, bist damit aber auch nicht so ganz glücklich.
edit: ich rate mal.
C++ objekte sollen binärkompatibel zu C structs sein.
... und sagt mir bitte, dass ich mich jetzt getäuscht habe.
-
Undertaker schrieb:
das hört sich ja so an, als wüsstest du die antwort, bist damit aber auch nicht so ganz glücklich.
Nein, es soll heißen, egal was man dir für eine Antwort gibt, du wirst es eh nicht gut finden, und ein "Aber..." bringen. Also, erspar ich mir die Antwort, weil die Antwort das Thema nicht beenden würde... egal ob ich damit zufrieden bin oder es nicht bin.
-
Artchi schrieb:
...egal was man dir für eine Antwort gibt, du wirst es eh nicht gut finden...
es geht nicht darum, ob ich es 'gut finde'. ich will einfach nur wissen, warum dynamic_casts langsam sind (oder sein müssen). was ich dann davon halte, musst du schon mir überlassen.
-
Undertaker schrieb:
Mr. N schrieb:
Das Auseinanderpfriemeln lässt sich unter Umständen auch wesentlich performanter als dynamic_cast implementieren. (Ich fürchte, du hast keine Vorstellung wie unglaublich langsam dynamic_cast laut Standard sein darf und meistens auch sein wird.)
warum eigentlich? warum können in C++ die objekte nicht einfach ihre typinformation immer mit sich führen. dann wären down casts doch recht schnell.
Die Objekte bei denen dynamic_cast möglich ist haben ihre Typinformationen. (Merkregel: Jedes Objekt mit virtuellen Methoden.)
dynamic_cast ist dennoch nicht schnell. dynamic_cast kann nämlich nicht nur in den tatsächlichen Typ der Klasse casten sondern auch in (so gut wie) alle Basisklassen. Und die übliche Implementierung regelt das mit einer ganzen Menge Indirektion, und die kostet, wie du als C-Fan wissen solltest.
-
Mr. N schrieb:
dynamic_cast kann nämlich nicht nur in den tatsächlichen Typ der Klasse casten sondern auch in (so gut wie) alle Basisklassen.
ach so, und deshalb muss es sich durch die komplette vererbungshirarchie hangeln.
danke für die erklärung (der Artchi wusste das nämlich nicht)
naja, dann könnte man einen cast in den originaltypen ja so beschleunigen:... OriginalType *original = 0; if (typeid(OriginalType) == typeid(*Object)) original = (OriginalType*)Object; // <-- einfacher C style cast ...
sollte so typsicher sein, wie ein dynamic_cast
-
...und was meinst du, macht
typeid
? Narr!greetz, Swordfish
-
Undertaker schrieb:
sollte so typsicher sein, wie ein dynamic_cast
Mal ehrlich: manchmal weiß ich nicht ob du dich lächerlich machen willst oder trollen willst. Jedenfalls ernst nehmen kann dich keiner...
-
Swordfish schrieb:
...und was meinst du, macht
typeid
? Narr!nun, in meinem grenzenlosen optimismus glaube ich fest daran, dass man mit 'typeid' einfach herauskriegen kann, ob ein objekt ganz genau eine instanz von dem erfragten typ ist, ohne dass dabei verwandschaftsgrade berücksichtigt werden (denn für den fall gibt es ja schon dynamic_cast). oder bin ich auf dem holzweg?
-
Warum antwortet ihr ihm denn? Ich hab doch schon gesagt, das er die Antwort nicht hinnehmen wird, und ein "Aber..." bringen wird. Genau das ist passiert und er hat sich wieder blamiert.
Undertaker! Ich wusste die Antwort, da dynamic_cast und seine Arbeitsweise schon mehrmals im C++-Forum beschrieben wurde. Aber ich muß mir das nicht antun, und meine Erklärungen vorwissentlich von einem Troll null und nichtig machen lassen.
-
-------------------------- /| /| | | ||__|| | Trolle bitte | / O O\__ nicht | / \ füttern! | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | |// |____ --| * _ | |_|_|_| | \-/ *-- _--\ _ \ // | / _ \\ _ // | / * / \_ /- | - | | * ___ c_c_c_C/ \C_c_c_c____________
-
Shade Of Mine schrieb:
Undertaker schrieb:
sollte so typsicher sein, wie ein dynamic_cast
Mal ehrlich: manchmal weiß ich nicht ob du dich lächerlich machen willst oder trollen willst. Jedenfalls ernst nehmen kann dich keiner...
Wenn du das selbst gemacht hättest, wärs cool, aber mit so na billigen Anleitung. Gähn.
-
Wie's
typeid
macht ist IMHO nicht Standardisiert -> Jeder Compiler darf sein eigenes Süppchen kochen...greetz, Swordfish
-
Swordfish schrieb:
Wie's
typeid
macht ist IMHO nicht Standardisiert -> Jeder Compiler darf sein eigenes Süppchen kochen...ich hab's grad' mal ausprobiert:
class A {}; class B : public A {}; int main () { B *b = new B; if (typeid(B) == typeid(*b)) cout << "b is a B" << endl; if (typeid(A) == typeid(*b)) cout << "b is also an A" << endl; }
scheint zu klappen.
aber wenn es so ist wie du sagst, könnte es dann auch compiler geben, die den zweiten vergleich durchlassen?
-
Du tust jedenfalls nicht das gleiche wie dynamic_cast.
Nimm Klasse A, erbe davon Klasse B und davon nochmal Klasse C. Wenn Du jetzt einen A-Pointer auf ein C-Objekt hast, dann macht dynamic_cast dir auch nen schönen cast auf B. Aber die Variante mit typeid schlägt fehl.
-
Jester schrieb:
Du tust jedenfalls nicht das gleiche wie dynamic_cast.
Nimm Klasse A, erbe davon Klasse B und davon nochmal Klasse C. Wenn Du jetzt einen A-Pointer auf ein C-Objekt hast, dann macht dynamic_cast dir auch nen schönen cast auf B. Aber die Variante mit typeid schlägt fehl.richtig, aber dafür müsste 'typeid' geschwindiglkeitsmässig eine rakete sein, im vergleich zu 'dynamic_cast'.
wenn man ein objekt wieder in seinen ausgangstyp zurückcasten will, dann müsste ein check mit 'typeid' und danach ein einfacher cast doch optimal sein, weil eben nicht die gesamte vererbungsstruktur durchsucht wird.
-
Undertaker schrieb:
richtig, aber dafür müsste 'typeid' geschwindiglkeitsmässig eine rakete sein, im vergleich zu 'dynamic_cast'.
wenn man ein objekt wieder in seinen ausgangstyp zurückcasten will, dann müsste ein check mit 'typeid' und danach ein einfacher cast doch optimal sein, weil eben nicht die gesamte vererbungsstruktur durchsucht wird.
Für "Fehlerfälle" - ja. Aber wenn du sowieso den richtigen Typen verwendest, musst dynamic_cast ja auch nicht die komplette Hierachie durchlaufen sondern matcht sofort den ersten Typen.
Ein Fehlerfall ist dann natürlich schneller - aber er macht ja auch etwas komplett anderes. Äpfel und Birnen, du weißt.
-
Ich könnte mich ja irren, aber sind C++-Diskussionen in Neuigkeiten nicht eigentlich OT???
-
Da 6 (in Worten: Sechs) Moderatoren mitdiskuttieren, irrst Du bestimmt.
greetz, Swordfish
-
Marc++us schrieb:
Ich könnte mich ja irren, aber sind C++-Diskussionen in Neuigkeiten nicht eigentlich OT???
im c++ forum gelten solche diskussionen als pure blasphemie. dann kommt der CStoll daher und schmeisst mich wieder raus...
Swordfish schrieb:
Da 6 (in Worten: Sechs) Moderatoren mitdiskuttieren...
oh, sind Artchi und Mr.N gerade zu moderatoren ernannt worden?
-
Undertaker schrieb:
Swordfish schrieb:
Da 6 (in Worten: Sechs) Moderatoren mitdiskuttieren...
oh, sind Artchi und Mr.N gerade zu moderatoren ernannt worden?
Nö, hab' mich aber verzählt: 7 (CStoll, nman, Tim, estartu, SideWinder, Jester, Shade Of Mine)
greetz, Swordfish
PS: Kann jetzt bitte einer dieses Rumgetrolle beenden!?