calloc - dynamic oder static cast?



  • 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.htm

    Greetz



  • Vellas schrieb:

    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

    Wenn nicht definiert ist was drinnen steht sind die für micht nicht initialisiert. Dass sie in jedem Fall "default konstruiert" sind ist klar. Aber egal. "new int []" (oder double) macht auf jeden Fall keine zero-initialization, oder?

    Und kann es sein dass du das mit VC im Debug-Mode ausprobiert hast? Im Debug Mode wird *alles* initialisiert, mit 0xcd für neu allozierte Sachen, und 0xdd wird über gelöschte Sachen drübergeschrieben, 0xfd sind "guard bytes" vor oder hinter Buffern etc. Das ist bloss ne Debug-Hilfe. Hat aber mit dem C++ Standard nix zu tun 🙂

    @"Strichi-Strichi" ("---") und "auf jeden fall":
    Nein, ein double hat keinen Konstruktor (und auch keinen Destruktor). Aus. Ende. Dass man mit templates was schreiben kann was dann wie ein Konstruktor-Aufruf aussieht ist eine andere Sache. Das ist soetwas wie void-returns, das heisst noch lange nicht dass eine void Funktion einen "Wert vom Typ void zurückgibt", bloss weil man es so schreiben kann als täte sie es.



  • double* p = new double[10]();
    

    Die Klammern bewirken das der Konstruktor von double aufgerufen wird.


Anmelden zum Antworten