Zeiger , klassen und speicherverbrauch....



  • sagt mal, kann man pauschal sagen, wieviel ein zeiger auf eine bestehende klasse, die ich mit new angelegt habe benötigt ?

    ich gehe ja mal davon aus, dass das nicht von der klassengrösse abhängt. ich muss ein paar tausend kopien dieser klasse in einer verketteten liste anlegen und benötige aber an anderer stelle aber eine andere anordnung der klassenzeiger. nun muss ich mich entscheiden, was wichtiger ist. speicher oder geschwindigkeit, wenn ich ständig ein paar tausend von diesen zeigern umsortieren muss. macht es sich sehr bemerkbar, wenn man also einfach zwei verschiedene listen mit zeigern im speicher behält ?

    wäre toll, wenn mich mal jemand dazu aufklärt 🙂

    danke!



  • Klassen verbrauchen keinen Speicher, sondern Objekte. :p Und über einen Zeiger kann man in C++ nicht die Größe des adressierten Objekts auslesen, da musst du schon selbst die Größen irgendwo vermerken.



  • sagt mal, kann man pauschal sagen, wieviel ein zeiger auf eine bestehende klasse, die ich mit new angelegt habe benötigt

    normale zeiger sind konstant 4 byte groß(kann sich aber in den nächsten jahren ändern). basisklassen zeiger sind bis zu 20 byte groß, also vorsicht



  • otze schrieb:

    basisklassen zeiger sind bis zu 20 byte groß, also vorsicht

    Beispiel?



  • grml grad als ich das beispiel geschrieben hab, viel mir auf, dass ich method zeiger im kopf hatte-.-
    Ich sollte wohl doch mal en paar tage abschalten, vielleicht funzt die konzentration dann besser, atm werf ich ja alles durcheinander 👎

    ok: zeiger sind immer konstant groß.



  • otze schrieb:

    grml grad als ich das beispiel geschrieben hab, viel mir auf, dass ich method zeiger im kopf hatte-.-

    Wobei die eigentlich auch mit 12-Byte auskommen sollten (auf einer normalen 32bit Platform). Adresse der Memberfunktion (oder 0 falls virtuell), int für this-Offset-Anpassung, int für Vtable-Index. Aber die Implementation eines solchen Zeigers ist natürlich nicht vorgeschrieben.



  • es gibt noch den unknown zeiger, der ist sehr groß. verwendet wird er hier:

    class Foo;//über die Klasse ist nichts bekannt
    class Bar{
        typedef int (Foo::*MP)();//der standard schreibt vor, dass das möglich ist
        MP Foobar;
        //...
    };
    

    Foobar ist in dem fall je nach compiler bis zu 20Byte groß.
    is aber wie gesagt compilerabhängig, gibt compiler, die den zeiger auf 8Byte zusammenquetschen können...

    hab mal kurz gesucht, so machts der g++ in etwa:

    struct {
       union {
         FunctionPointer m_funcadr; // always even
         int m_vtable_index_2; //  = vindex*2+1, always odd
       };
       int m_delta;
    };
    


  • otze schrieb:

    es gibt noch den unknown zeiger, der ist sehr groß. verwendet wird er hier:

    class Foo;//über die Klasse ist nichts bekannt
    class Bar{
        typedef int (Foo::*MP)();//der standard schreibt vor, dass das möglich ist
        MP Foobar;
        //...
    };
    

    Wieso unknown-Zeiger? Wo hast du das denn her? Siehts für mich wie ein ganz normaler Memberfunktionszeiger aus.

    hab mal kurz gesucht, so machts der g++ in etwa:

    struct {
       union {
         FunctionPointer m_funcadr; // always even
         int m_vtable_index_2; //  = vindex*2+1, always odd
       };
       int m_delta;
    };
    

    Netter Trick, das niederwertigste Bit als Typetag zu «missbrauchen» 🙂



  • @Bashar intern wird er aber unknown zeiger genannt, da der compiler zwischen single,multi und virtual vererbung unterscheidet. Kennt er die Klasse nicht, so fällt er auf eine unknown version zurück.



  • Das wär aber blöd, weil dann Zeiger aus zwei unterschiedlichen Übersetzungseinheiten, nur in einer davon sei Foos Definition bekannt, inkompatibel wären.



  • nein, die werden automatisch konvertiert, der unknown zeiger ist nicht umsonst so groß. er kann jeden anderen methodpointer aufnehmen.



  • Wie soll das mit einem statischen Typsystem gehen? Die ÜE weiss doch nichts über die andere.



  • frag nicht mich, frag die compilerbauer. der standard schreibts so vor. ende 😉



  • Chapter&Verse, please.



  • ka, du hast du den standard. 😉

    ich les mich nur durch quellen, die sich auf den standard beziehen 😉

    atm is das diese quelle:
    http://www.codeproject.com/cpp/FastDelegate.asp



  • In der Quelle steht zwar, dass der MS das so macht (WIE ist mir immer noch unklar), aber nicht, dass der Standard das vorschreibt.



  • Gelöscht.



  • scheinbar bin ich zu dumm, da irgendetwas über methodpointer zu finden 😞 ne halbe stunde suchen hat nix gebracht 😞



  • member function



  • auch darutner hab ich gesucht, und auch wieder gabs nichts

    //edit nu hab ich zwar was gefunden nach dem motto: "so sieht ein method-pointer aus", aber mehr gabs bisher immernoch nicht. Naja, und meine suche nach schlüsselwörtern wie vtable(virtual table) waren auch nicht von erfolg gekrönt,obwohl das ja direkt mit dem thema zusammenhängt...aber sowas muss doch im standard vorgeschrieben sein...nur wo

    //edit überseh ich da was, oder fehlen so ziemlich alle technischen abschnitte?
    oder gehören solche sachen wie linking oder zusammenfassen von übersetzungseinheiten nicht zu dem, was der standard den compilern vorschreibt?



  • otze schrieb:

    //edit überseh ich da was, oder fehlen so ziemlich alle technischen abschnitte?
    oder gehören solche sachen wie linking oder zusammenfassen von übersetzungseinheiten nicht zu dem, was der standard den compilern vorschreibt?

    Richtig, sowas ist der einzelnen Implementation überlassen.


Anmelden zum Antworten