calloc - dynamic oder static cast?
-
Hallo,
wenn ich in C ein array über calloc alloziiere:
double* arr = (double*)calloc(...);und dieses einfach der C++ - Konformheit nach Meyer in einen static oder dynamic cast
casten will - was nehme ich? static_cast oder dynamic_cast?Danke euch
-
Gar keinen - sondern gleich new oder std::vector<double> nutzen.
-
Hallo
- in C++ wird kein calloc verwendet, sondern new
- in C++ brauchst du mit new auch keinen cast
- in C++ würde ich stattdem rohen dynamischen Array lieber std::vector raten ( Siehe Magazinartikel über STL-Container hier im Forum)bis bald
akari
-
Wenn du dynamic_cast ausprobiert hättest wüsstest du dass es garnicht geht (der Compiler lässt dich nicht)
Weil: mit dynamic_cast kannst du nur casten wenn der Ausgangstyp "polymorph" ist, d.h. eine Klasse mit min. einer "virtual" Funktion (richtiger: ein Zeiger oder eine Referenz auf soetwas). Da "void *" diese Bedingung nicht erfüllt... nix mit dynamic_cast.In deinem Fall ist also "static_cast" angebracht.
Und wie kommst du grad auf calloc? Statt calloc kannst du hier einfach "new double[N]" verwenden. Die einzige Funktion aus der "alloc" Familie die in C++ noch Sinn macht ist IMHO alloca, weil alloca verflucht schnell ist. Dafür muss man bei alloca aber auch aufpassen, und "genau wissen was man tut".
-
jo danke euch...
werd schauen dass ichs mit new anlege....@hustbaer: was meinst du mit "verflucht aufpassen" ?
-
Naja... niemals zuviel anfordern, niemals freigeben, aufpassen auf Rekursionen (alloca in einer rekursiven Funktion kann schnell viel viel Stack brauchen) etc.
-
hustbaer schrieb:
Naja... niemals zuviel anfordern, niemals freigeben, aufpassen auf Rekursionen (alloca in einer rekursiven Funktion kann schnell viel viel Stack brauchen) etc.
Da alloca() nicht von allen Betriebssystemen unterstützt wird, wurde es auch nicht in den Ansi C oder C99 Standard aufgenommen.
siehe auch http://c-faq.com/malloc/alloca.html.
-
@Gerhard W, danke für den Hinweis und den Link. Wusste nicht dass alloca nicht Standard ist.
Ist bloss schade dass C++ die "variable-length arrays" von C99 nicht unterstützt

Sonst könnte man (fast immer) die hernehmen statt alloca...Obwohl, SO oft hab ich alloca auch noch nicht gebraucht

-
hustbaer schrieb:
Ist bloss schade dass C++ die "variable-length arrays" von C99 nicht unterstützt

Dafür gibt es Containerklassen (z.B. std::vector)

-
CStoll, *gähn*. Containerklassen sind laaaaaaangsam, VLAs sind schnell. Oder anders gesagt: VLAs sind vom Mars, Containerklassen von der Venus. Und das eine kein Ersatz für das andere. Oder so

-
festgestellt: crap. war nur luck.
-
akari schrieb:
- in C++ wird kein calloc verwendet, sondern new
setzt denn 'new' alles auf 0?
'calloc' macht das.
-
net schrieb:
akari schrieb:
- in C++ wird kein calloc verwendet, sondern new
setzt denn 'new' alles auf 0?
'calloc' macht das.new ruft den Konstruktor auf.
Greetz
-
Ein double hat keinen Konstruktor.
-
hustbaer schrieb:
Ein double hat keinen Konstruktor.
[ironie] Nein! Ist nicht wahr.
[/ironie]
Das wäre halt die logische Schlussfolgerung gewesen zu meiner Aussage.
Mal abgesehen davon das die Aussage davor bereits falsch war. Denn bei new kann man den Speicher initialisieren, im Gegensatz zu new[] (aber auch da gibt es Möglichkeiten).Greetz
-
hustbaer schrieb:
CStoll, *gähn*. Containerklassen sind laaaaaaangsam, VLAs sind schnell. Oder anders gesagt: VLAs sind vom Mars, Containerklassen von der Venus. Und das eine kein Ersatz für das andere. Oder so

Vor allem gehören Container und VLAs zu völlig unterschiedlichen Sprachen, also lohnt es sich überhaupt nicht, die miteinander zu vergleichen.
hustbaer schrieb:
Ein double hat keinen Konstruktor.
Wenn du unbedingt objektorientiert denken willst, dann hat double auch "Konstruktoren" (auch wenn C++ die vermutlich anders behandelt als klassische Konstruktoren) - und
p=new double[x];initialisiert afaik alle Elemente des angelegten Feldes mit 0.0.
-
CStoll schrieb:
hustbaer schrieb:
Ein double hat keinen Konstruktor.
Wenn du unbedingt objektorientiert denken willst, dann hat double auch "Konstruktoren" (auch wenn C++ die vermutlich anders behandelt als klassische Konstruktoren) - und
p=new double[x];initialisiert afaik alle Elemente des angelegten Feldes mit 0.0.Greetz
-
hustbaer schrieb:
Ein double hat keinen Konstruktor.
Doch.
-
Einen Destruktor hat double:
template<class T> void callDestructor(T& object) { object.~T(); } int main() { double d = 5.0; callDestructor(d); }
-
Für built-in Typen hat das eine ganze einfache bedeutung, da es bei diesen zumindest keinen Standardkonstruktor gibt, sie sind einfach nicht initialisiert (d.h. sie haben dann einen undefinierten Wert).
Siehe auch hier:
http://tutorial.schornboeck.net/initliste.htmGreetz