Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

1

03.09.2012, 12:59

Ergebnis von sizeof unerklärlich !

Hallo

Ich habe zwei Matrix-Klassen für 44 und 33 Matrizen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class CMatrix33
{
public:
    union
    {
        /*
        Mathematische Order [memory index layout]
        11[0]  12[3]  13[6]
        21[1]  22[4]  23[7]
        31[2]  32[5]  33[8]
        */

        struct
        {
            float m11; float m21; float m31;
            float m12; float m22; float m32;
            float m13; float m23; float m33;
        };
        
        float m[9];
    };

public:
    CMatrix33(void);
    CMatrix33(const CMatrix33& M);
    virtual ~CMatrix33(void);
    CVector3  operator * (CVector3& v);
    static CMatrix33 Build_IdentityMatrix();
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class CMatrix44
{
public:
    union
    {
        /*
        Mathematische Order [memory index layout]
        11[0]  12[4]  13[ 8]  14[12]
        21[1]  22[5]  23[ 9]  24[13]
        31[2]  32[6]  33[10]  34[14]
        41[3]  42[7]  43[11]  44[15]
        */

        struct
        {
            float m11; float m21; float m31; float m41;
            float m12; float m22; float m32; float m42;
            float m13; float m23; float m33; float m43;
            float m14; float m24; float m34; float m44;
        };
        
        float m[16];
    };

    CMatrix44();
    CMatrix44(const CMatrix44& M);
    void operator *= (CMatrix44& m);
    CMatrix44 operator * (CMatrix44& m);
    CVector3  operator * (CVector3& v);
    CMatrix44 Invert();
    CMatrix44 Transpose();
    CMatrix33 ConvertToMat33();
    CMatrix33 ConvertToNormalMat();

private:
    float DetSub(int line, int column);
    float DetMain();

public:
    // Build Matrix
    static CMatrix44 Build_IdentityMatrix    ();
    static CMatrix44 Build_TranslationMatrix (float x, float y, float z);
    static CMatrix44 Build_TranslationMatrix (CVector3& v);
    static CMatrix44 Build_RotationMatrix    (float AngleX, float AngleY, float AngleZ);
    static CMatrix44 Build_RotationMatrix    (CVector3& v);
    static CMatrix44 Build_RotationMatrix    (CVector3& v, float Angle);
    static CMatrix44 Build_ViewMatrix        (CVector3& eye, CVector3& center, CVector3& up);
    static CMatrix44 Build_ProjectionMatrix  (float fovy, float aspect, float zNear, float zFar);
    static CMatrix44 Build_ScaleMatrix       (float x, float y, float z);
    static CMatrix44 Build_ScaleMatrix       (CVector3& v);
};


Vom Prinzip sind beide Klassen gleich aufgebaut.
Wenn ich Instanzen der Klassen erzeuge und mir die Größe mit sizeof anzeigen lassen will liefert sizeof(CMatrix44) 64 bytes also 16 * 4.
sizeof(CMatrix33) liefert 40 bytes also 10 * 4 obwohl nur 9 floats enthalten sind.
Ich habe schon mit PRAGMA PACK(1, 2, 4) versucht das Problem zu lösen, aber ich bekomme die 40 bytes nicht weg.

Hat jemand eine Idee ????
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.09.2012, 13:04

Dein Problem ist der virtuelle Destruktor ;)

Edit: Für deine Matrix Klasse solltest du wohl am besten gar keinen Destruktor definieren.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

03.09.2012, 13:05

Die vtbl benötigt bei dir eben noch 4 Byte mehr.

Edit:
Wie dot ja bereits schon vor einer Minute sagte! :)
@D13_Dreinig

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

4

03.09.2012, 13:12

Vielen Dank !

Den V-Table Pointer hatte ich ausgeschloßen weil keine Vererbung benutzt wird.
Ich schmeiße den Destruktor raus.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

5

03.09.2012, 13:43

Die vtable kriegst du auch nicht durch Vererbung, sondern dadurch, dass dein Destruktor virtuell ist. Du kannst vererben so viel zu willst, solange du keine virtuellen Methoden hast, kriegst du keine vtable.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

6

03.09.2012, 22:06

Zitat

Die vtable kriegst du auch nicht durch Vererbung, sondern dadurch, dass dein Destruktor virtuell ist. Du kannst vererben so viel zu willst, solange du keine virtuellen Methoden hast, kriegst du keine vtable.


Das ist mir schon klar. Aber du wirst mir doch zustimmen das eine V-Table ohne Vererbung völlig Sinnlos ist.
Deshalb hatte ich angenommen der Kompiler setzt virtuelle Methoden erst als solche um wenn vererbt wird.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

03.09.2012, 22:13

Der Compiler kann diese Tatsache aber eventuell nicht wissen, denn selbst kompilierter Code ist kein finaler Code. Siehe Libraries oder Module.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

8

03.09.2012, 22:19

Der Compiler kann diese Tatsache aber eventuell nicht wissen, denn selbst kompilierter Code ist kein finaler Code. Siehe Libraries oder Module.


Da hast du natürlich Recht. Sei es drum.
Nochmal mache ich den Fehler nicht !
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

03.09.2012, 22:33

:) Ist auch ein sehr spezieller Fall und ehrlich gesagt hätte ich mich vermutlich auch gewundert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

04.09.2012, 14:40

Hab die Diskussion über virtuelle Destruktoren mal abgetrennt.

Werbeanzeige