Wann notwendig static_cast verwenden?
-
static_cast bei normaler vererbung: normal 0 takte. der zeiger wird nur anders interpretiert. Mehrfachvererbung bin ich mir nicht ganz sicher, aber viel wirds nicht sein.
dynamic_cast: implementationsabhängig, normal aber eher sehr langsam.
-
BorisDieKlinge schrieb:
ok, wie sieht es performancetechnisch aus? wird bei downcast viel rechenzeit benöigt?
Ein static_cast kostet keine Rechenzeit - es finden ja keine checks statt. Ein dynamic_cast dagegen muss erstmal checken ob der cast legal ist. Er kostet daher ein paar Lookups - je nachdem wie Tief die Klassenhierachie ist wird er teuerer. Ein Fehlschlagen ist immer worst case.
Im Prinzip ist das aber komplett uninteressant: wenn man downcasten oder crosscasten muss und man dynamic_cast verwenden muss dann muss man das eben. Meistens liegt es in einem fehlerhaften Design begründet, manchmal geht es nicht anders.
Performance sollte dann relativ irrelevant sein da man sowieso fast alles menschenmögliche tut um so eine Situation zu vermeiden.
CrossCasts gehen nur mit dynamic_cast, da die beiden Klassen nicht direkt miteinander verwandt sind. Downcasts gehen auch mit static_cast - sofern man sich sicher ist dass der cast legal ist.
-
wenn ich mir also imemr sicher bin auf welchen objekt typ ich casten musst, ist static_cast nicht unbedingt unschön in der programmierung!?
-
naja, unschoen aussehn tuts immer, aber manchmal muss man halt zu unschoenen Mitteln greifen. C++ ist halt auch keine Bonbon-rosane Plueschwelt
-
naja hatte immer angst , das es performance kostet, wenn ich mit static_cast downcaste.. aber wenn es nichts ausmacht, dann nehm ich das mal in kauf..
-
Aber in welchen fällen ist denoch auf ein static_cast /dynamic_cast nicht zu verzichten?
class B { public: virtual void foo() = 0; void optional() {} }; class D : public B { public: void foo() {} void onlyforme(){} }; int main() { B* b = new D; b->foo(); //call D::foo(); b->optional() //call B::optional() dynamic_cast<D*>(b)->onlyforme();//call D::onlyforme return 0; }
hier um onlyforme aufzurufen, muss man es casten, od definiert onlyforme wie foo
-
ok so ähnlich siehts in meinem fall aus., auser das ich static_cast statt dynamic_cast verwende, was auch ok ist, weil es wie im beispile ganz sicher ein B objekt ist...
-
netrobot schrieb:
Aber in welchen fällen ist denoch auf ein static_cast /dynamic_cast nicht zu verzichten?
class B { public: virtual void foo() = 0; void optional() {} }; class D : public B { public: void foo() {} void onlyforme(){} }; int main() { B* b = new D; b->foo(); //call D::foo(); b->optional() //call B::optional() dynamic_cast<D*>(b)->onlyforme();//call D::onlyforme return 0; }
hier um onlyforme aufzurufen, muss man es casten, od definiert onlyforme wie foo
Wobei hier die Frage ist, wie es dazu kommt, dass man "von D nur einen B-Zeiger in Händen hält". Üblicherweise kommt sowas vor, weil man Polymorphie nutzen möchte (z.B. über eine generalisierte API aufrufen) ... und da zeugt es IMHO schon von schlechtem Design (oder einem sehr, sehr scharfen Messer am Hals
) , wenn man dann doch plötzlich auf "nicht-generelle Eigenschaften" zugreifen möchte/muss.
Gruß,
Simon2.
-
Simon2 schrieb:
...oder einem sehr, sehr scharfen Messer am Hals
...
Hört sich nach typischen Abläufen bei Softwareprojekten an
cu André
-
asc schrieb:
Simon2 schrieb:
...oder einem sehr, sehr scharfen Messer am Hals
...
Hört sich nach typischen Abläufen bei Softwareprojekten an
cu André
Ich muss gestehen, dass ich das frei nach Scott Meyers zitiert habe (Kapitel weiß ich nicht mehr) - hat mich sehr beeindruckt !
Gruß,
Simon2.