ByteArray mit new oder ohne



  • Hallo

    worin besteht eigentlich der Unterschied zwischen

    BYTE data[400];
    

    und

    BYTE *data = new BYTE [400];
    

    welches dann mit delete[] wieder vom Heap gelöscht werden muss bzw. kann...

    Wird das erste BYTE-Array auf dem Stack abgelegt? Und wird dies auch irgendwann wieder gelöscht bzw. bei jedem Aufruf der Funktion wieder erzeugt? Und welche Version macht mehr Sinn?

    Gruß
    Simon



  • Wird das erste BYTE-Array auf dem Stack abgelegt?

    Ja.

    Und wird dies auch irgendwann wieder gelöscht

    Ja, sobald es den Gültigkeitsbereich verlässt, in dem es angelegt wird.

    bei jedem Aufruf der Funktion wieder erzeugt?

    Ja.

    Und welche Version macht mehr Sinn?

    Wenn schon rohe Arrays, dann macht Version 1 mehr Sinn, da du dich nicht um Speicherlecks kümmern musst. Generell sollte aber eher std::vector oder std::tr1::array verwendet werden.

    ....



  • Simon Krag schrieb:

    Wird das erste BYTE-Array auf dem Stack abgelegt?

    kommt drauf an, wo es steht.
    Auf Namensraumebene: Array liegt im "statischen" Speicher
    In einer Klassendef: Array ist Teil des Objekts
    In einer Funktion: Array liegt im "automatischen" Speicher (typischerweise Stack)

    Simon Krag schrieb:

    Und wird dies auch irgendwann wieder gelöscht bzw. bei jedem Aufruf der Funktion wieder erzeugt?

    Das ist genauso wie bei "normalen Variablen" auch.

    void foo() {
      int i;    // <-- quasi wie ein 1-Elementiges Array
      int j[3]; // <-- 3 ints hintereinander
    }
    

    Es ist wichtig zu verstehen, dass hier keine versteckte Indirektion bei so einem Array stattfindet. Es funktioniert nicht so wie in einigen anderen Sprachen (zB Java) wo man viel und implizit mit Referenzen zu tun hat. In C und C++ gibt es die Indirektion nur dann, wenn man es explizit angibt (zB durch Zeiger). Dann sollte auch klar sein, dass es da kein Speicherleck oder so geben wird.

    Simon Krag schrieb:

    Und welche Version macht mehr Sinn?

    Eigentlich ist beides nicht so toll. Alternativen:

    std::tr1::array<int,23> a;
    std::vector<int> v (23);
    

    kk



  • Die Antwort ist letztendlich eine Frage der Anforderung.

    Wenn es keine besonderen Anforderungen gibt, dann solltest du,
    wie schon erwähnt, STL Container (Vector, ...) verwenden.
    Die STL ist sehr mächtig und man kann 'flott' was programmieren was viele Daten behandeln kann.
    Das kann dann aber auch genauso 'flott' recht langsam werden.

    STL Container arbeiten (weines Wissen) immer mit dem Heap.
    Heap Speicher ist deutlich langsamer als Stack Speicher und
    es gibt auch noch Effekte wie 'Heap Fragmentierung'.
    Objkete mit temporärem Charackter sind bei Performace relevanten Anwendungen oft sinnvoller auf dem Stack angelegt.

    Leider bietet die STL meines Wissens nach nicht die Möglichkeit den Stack stäker einzubeziehen, was bei mir schon mal öfters dazu führt,
    das ich nicht immer STL verwende.

    Weiss jemand mehr ?

    Danke Gruß Frank



  • Frank Erdorf schrieb:

    Weiss jemand mehr ?

    Ja.
    Dafür gibt es std::tr1::array<int,23> //liegt auf dem stack!

    Außerdem will man mit 400 Bytes meistens auch was spannendes machen. Wenn es nicht bloß mal hin- und herkopieren ist, sondern auch noch was gerechnet wird, sind ganz flott die Kosten für new/delete unter einem Prozent und man kann sie ruhig zahlen, um einfach nicht in die Nähe eines Stack Overflows zu kommen.
    Bei 400 in einer nicht-rekursiven Funktion drängt es mich aber auch ganz stark zum Stack.


Anmelden zum Antworten