Objektgröße



  • Wenn ich folgendes schreibe:

    #include<iostream>
    
    using namespace std;
    
    #include<conio.h>
    
    class Test
    {
    private:
        int i;
        long l;
        double d;
        char c;
    public:
        Test() {}
        ~Test() {}
    };
    
    int main()
    
    {
        cout<<sizeof(Test)<<endl<<sizeof(int)+sizeof(long)+sizeof(double)+sizeof(char)<<endl;
    
        getch();
        return 0;
    }
    

    gibt der Rechner 24 und 17 aus.
    Woraus resultiert der Unterschied?



  • am padding das der compiler macht wenn du ihm das nicht verbietest.



  • rapso schrieb:

    [...]padding[...]

    Was ist'n das?



  • fürn computer ist es irgendwie "leichter" mit "24" zu rechnen, als mit "17"... Wenn dein objekt 24 bytes benötigt, funktioniert die zeigerarithmetik ein bisschen schneller, und es kann schneller spiecherplatz "allociiert" (wie schreibt man das auf deutsch?^^ *schäm*) werden. dadurch entstehen zwar ungebrauchte abschnitte auf dem speicher, so funktioniert jedoch alles schneller. Solange dein programm nicht extrem speicherintensiv ist, macht es gar nichts. Aber irgendwo hab ich mal gelesen, dass es was bringt, wenn du deine member-variables der klasse der größe nach sortierst... weiß aber auch nicht, warum es so ist. Das haben sich schlaue leute so ausgedacht, ist schon richtig so 😉



  • Andrey schrieb:

    "allociiert" (wie schreibt man das auf deutsch?^^ *schäm*)

    allokiert 😉 wenn die Fragen immer so einfach wären...



  • allokieren, ich allokiere, du allokierst, allocator allokiert? Okay, werds mir merkn 😃



  • muffmolch schrieb:

    Andrey schrieb:

    "allociiert" (wie schreibt man das auf deutsch?^^ *schäm*)

    allokiert 😉 wenn die Fragen immer so einfach wären...

    Laut meinem tollen Buch allozieren 😕



  • aaahaaa! da ist also doch irgendwo n "z" drinne! hab ichs doch gewusst! passt mal auf kids, jetzt geh ich duden suchn^^ jaa, ich hab sowas irgendwo rumliegen, n paar bücher zu menschlichen sprachen werden sich auf dem regal auch finden^^ 😃

    \edit: also im duden steht "allozieren" aber es werden auch oft verben "allokieren" und "alloziieren" verwendet. Es heißt aber "Allokation" 💡



  • Wenn solche Sachen eure größten Probleme sind, dann seid ihr echt zu beneiden. 😃



  • ne, ist leider nich der fall... aber wenn man andauernd nur über große probleme nachdenkt, geht man irgendwann kaputt 🙄



  • Ich erweitere das nochmal.
    Die char-Variable wird mit zusätzlichen 3 Bytes auf insgesamt 4 Bytes "gepadded". Dazu kommen aber auch nochmal 4 Bytes vom this-Zeiger der implizit zur Test-Klasse gehört.
    Das macht dann:
    4Bytes(int)+4Bytes(long)+8Bytes(double)+1+3Bytes(char)+4Bytes(*Test=this-Zeiger) = 24 Bytes.



  • Tachyon schrieb:

    Ich erweitere das nochmal.
    Die char-Variable wird mit zusätzlichen 3 Bytes auf insgesamt 4 Bytes "gepadded". Dazu kommen aber auch nochmal 4 Bytes vom this-Zeiger der implizit zur Test-Klasse gehört.
    Das macht dann:
    4Bytes(int)+4Bytes(long)+8Bytes(double)+1+3Bytes(char)+4Bytes(*Test=this-Zeiger) = 24 Bytes.

    😮
    nein, es gibt keinen this zeiger in einer klasse, this ist die klasse, wozu ein zeiger auf sich selbst? das waere krank.
    er hat einfach ein padding auf 8byte, das ist alles, (x+7)&~7, also 24.



  • Tachyon schrieb:

    Ich erweitere das nochmal.
    Die char-Variable wird mit zusätzlichen 3 Bytes auf insgesamt 4 Bytes "gepadded". Dazu kommen aber auch nochmal 4 Bytes vom this-Zeiger der implizit zur Test-Klasse gehört.
    Das macht dann:
    4Bytes(int)+4Bytes(long)+8Bytes(double)+1+3Bytes(char)+4Bytes(*Test=this-Zeiger) = 24 Bytes.

    Vegiss den this Zeiger. Der würde ja dann auf sich selbst zeigen. Der Orginalposter hat wohl eine 64bit Architektur. Deshalb wird auf 8 Byte gepadded.

    Auf einer Unixmaschine wäre die Struct übrigends eher 32 Byte lang, da dort in 64bit ein long Länge 8 hat, und das int unglücklicherweise direkt am Anfang steht.



  • Achso, gibts ja erst bei Instanzen, das Ding. Okay.


Anmelden zum Antworten