Frage zur Speicherverwaltung bei Objekten



  • Hi.
    Ich würde gerne viele Objekte mit zB 2 bytes erzeugen. Wie ich gehört habe, werden zu jedem objekt noch 2 bytes angelegt für delete .
    Wie krige ich den zusätzlichen Ballast weg ?


  • Mod

    Was willst du erreichen? Frage nicht nach sinnlosen technischen Details, wenn es höchstwahrscheinlich sowieso eine viel bessere Lösung gibt.

    lk schrieb:

    Wäre so etwas möglich, um diesen zusätzlichen Ballast loszuwerden? :

    MyType Obj;
    MyType *ptrObj = &Obj;
    

    Ich sehe da überhaupt keinen Zusammenhang zwischen deiner Frage und dem Code.



  • Das problem ist, ich muss einen 3D array anlegen, mit 256x256x64 größe duchsnittlich, was aber auch 256x256x128 oder so sein kann.
    In jede Zelle davon muss ich eine ID haben(so etwa 150 möglichkeiten), und eine zweite ID(mit... 256*256*64 möglichkeiten 😕 ).
    Die zwite ID soll einen 'Trigger' angeben (die stehen in einer externen dynamischen liste). Der Trigger soll aufgerufen werden wenn etwas an der zelle passiert ist (nichts wird aufgerufen wenn der Trigger NULL ist).

    PS: guckt mal http://minecraft.net/play.jsp an



  • Definier dir doch eine Klasse die zwei Elemente speichert. Könnte aber auch ein struct oder ein int[2] sein.

    Das 3D Array würde ich als 1D Array anlegen und nur das Auslesen über 3 Dimensionen implementieren., also so was

    Wo sollten denn die 2 'delete bytes' angelegt werden?



  • Meinst du das Padding zwischen struct-Membern? Die meisten Compiler bieten dafür etwas an. gcc hat beispielsweise __attribute__((packed)), MSVC hat __declspec(align(1)).

    Im Übrigen empfinde ich deine schamlose Werbung als schamlos.



  • Zum einen gibt es das angesprochende Padding.
    So ist z.B. die Größe von

    class foo
    {
      int i;
      char c;
    };
    

    normalerweise sizeof(foo) == 8 . Damit der Integer immer auf einem Vielfachen von 4 liegt, wird hinter c auf 8 bytes aufgefüllt.

    Einen weitere "Overhead" gibt es, wenn ein Block mit new angefordert wird. Das ist ein kleiner Betrag vor dem gesamten Block. Also bei

    char* c = new char[100];
    

    vor c[0] , nicht vor jedem c[i] .

    Alles andere was du da erzählt hast, hab ich nicht verstanden.



  • Wie willst du zwei IDs, eine mit 150 verschiedenen Werten und eine mit 4 Mio. möglichen werten in zwei Byte ablegen 😕


Anmelden zum Antworten