Arraygrösse



  • Hallo

    Gibt es eine portable Möglichkeit, die Grösse eines Arrays zu bestimmen, welches auf dem Freispeicher mittles new[] angelegt wurde? Denn der delete[] muss wissen, wie Gross es ist um es Freigeben zu können...

    MfG, EOutOfResources



  • EOutOfResources schrieb:

    Gibt es eine portable Möglichkeit, die Grösse eines Arrays zu bestimmen, welches auf dem Freispeicher mittles new[] angelegt wurde?

    Nein.

    Vergiss mal ganz schnell, dass es so etwas wie new[] und delete[] gibt. Bevorzuge std::vector.



  • krümelkacker schrieb:

    Bevorzuge std::vector.

    Ich schreibe gerade ein paar Container um mich mit dem internen Aufbau vertraut zu machen...


  • Mod

    Dann merk dir die Größe irgendwie.



  • SeppJ schrieb:

    Dann merk dir die Größe irgendwie.

    Das habe ich bisher gemacht.



  • Es gibt keinen Standard-Weg.
    Natürlich merkt sich der new[] irgendwie, wie große das Array war, damit delete[] genau richtig wieder freigeben kann.
    Aber der Standard läßt offen, wie das geschieht.

    Nehmen wie mal einen Buddy-Allocator, der nur Zweierpotenzen als Speichergröße kann.

    Ich mache
    //sizeof(Foo)==4
    Foo* ai=new Foo[10];

    Da muß der Buddy-Allocator eh wissen, in welcher Ebene die Speicherseite war. new[] muß sich noch die 10 merken, damit delete[] genau 10 mal den Destruktor aufrufen kann.

    Macht es zum Beispiel so, daß es nicht 40, sondern 44 Bytes anfragt, und result+4Bytes zurückgibt. delete[] muß dann nur 4 Bytes zurückgehen und den dort liegenden int lesen, und weiß, wie oft der Destruktor aufgerufen werden muß.

    Aber sowas wollte man nicht festlegen, und das ist gut so.

    Ich mache
    //sizeof(int)==4
    int* ai=new Foo[10];
    Jetzt kann der schlaue Compiler darauf verzichten, die 10 nochmal extra zu speicher, weil keine Destruktoren aufgerufen werden müssen.

    Willst Du Doppelspeicherung vermeiden, dann benutze in Deinen Containern kein new[], sondern nur new und mach alles per Hand. Das hat aber meistens keine spürbaren Vorteile. Erst, wenn Du die Größe als Template-Argument übergibst, wird es lecker, WENN ein Allokator drunter liegt, der Zweierpotenzen allokiert UND seine Verwaltungsdaten nicht in die Seiten reinlegt, weil die Benutzer auch saugern Zweierpotenzen benutzen. Dann wird
    MyVector<int,1024> ohne Verschnitt 4094-aligned in eine Prozessorspeicherseite gelegt. Im Zusammenspiel von bescheidenen Containern und gutem dazu passenden Allokator mit Anwendungscode, der sowas mag, schätze ich, daß man um Faktor 7 schneller wird als Standardimplemetierungen, was die new-Kosten angeht.


Anmelden zum Antworten