sizeof falsch ?
-
typedef struct { float x, y, z; unsigned long color; enum FVF { FVF_Flags = D3DFVF_XYZ|D3DFVF_DIFFUSE, }; } VERTEX; int main(void) { size_t size3f = sizeof(float)*3; size_t sizeul = sizeof(unsigned long); size_t sizeenum = sizeof(enum FVF); size_t size = sizeof(VERTEX); return 0; }
Normal müsste ja: size3f + sizel + sizeenum = size ist aber nicht: 12 + 4 + 4 != 16
wo hackts ?
-
Der Compiler darf da machen was er will. (Padding bytes)
-
wie meinst du das ?
-
WeiseCoder schrieb:
typedef struct { float x, y, z; unsigned long color; enum FVF { FVF_Flags = D3DFVF_XYZ|D3DFVF_DIFFUSE, }; } VERTEX;
OT: Weil ich es da gerade sehe: Was unterscheidet obigen Code von
struct VERTEX { float x, y, z; unsigned long color; enum FVF { FVF_Flags = D3DFVF_XYZ|D3DFVF_DIFFUSE, }; };
??
-
WeiseCoder schrieb:
wie meinst du das ?
Hättest du mal nach dem Stichwort das ich dir gegeben hab gegoogled, hättest du es vielleicht auch verstanden.
-
In reinem C musste bei
struct foo {
};z.B. beim Anlegen einer Variable immer das struct voraustellen:
struct foo bar;mit dem typedef legst du einen Typalias fest und kannst dir das struct sparen:
struct _foo {
} foo;
struct _foo bar;
foo Bar;In C++ benutzt man eigentlich nur noch
struct foo { }; weil das bereits einen neuen Typ deklariert.
-
Außerdem lässt sich dein Beispiel noch vereinfachen.
class Test { float f; char c; };
sizeof(Test) == 8
Ok, das kann bei jedem Compiler anders sein.
-
aaaaaa schrieb:
WeiseCoder schrieb:
wie meinst du das ?
Hättest du mal nach dem Stichwort das ich dir gegeben hab gegoogled, hättest du es vielleicht auch verstanden.
ich mag so aussagekräftigen antworten, echt....
-
und ich mag so leute wie dich nicht
-
WeiserCoder, der Compiler richtet die Struktur an einer Zweierpotenz aus damit der Zugriff für Prozessor darauf schneller ist. Diese Ausrichtung kann man aber eigentlich bei jedem Compiler ändern oder ganz abschalten.
-
Und noch ein Link für dich: http://www.prompt.com/pwprod/pilot/online/node53.html
-
Blauer Programmierer schrieb:
WeiserCoder, der Compiler richtet die Struktur an einer Zweierpotenz aus damit der Zugriff für Prozessor darauf schneller ist. Diese Ausrichtung kann man aber eigentlich bei jedem Compiler ändern oder ganz abschalten.
auch wenn es so wäre, darf das nicht sein
12 + 4 + 4 != 16
dann müsste struktur 32 bit sein, und der macht daraus 16, obwohl mehr daten da sind als 16...
-
Ich denke mal das enum verbraucht in deiner Struktur keinen Platz. Du legst ja keine Instanz davon an.
-
WeiseCoder schrieb:
auch wenn es so wäre, darf das nicht sein
12 + 4 + 4 != 16
dann müsste struktur 32 bit sein, und der macht daraus 16, obwohl mehr daten da sind als 16...
Hm, im ersten Posting warens noch 12
16 kann ich dir sehr gut erklären: Du hast 3mal float (macht 12 Bytes) und ein long (4 Bytes), zusammen 16 Bytes. Wo nochmal 4 herkommen sollen, ist mir schleierhaft, du hast schließlich keine enum-Variable, sondern nur den Typ definiert.
-
interpreter schrieb:
In reinem C musste bei
struct foo {
};z.B. beim Anlegen einer Variable immer das struct voraustellen:
struct foo bar;mit dem typedef legst du einen Typalias fest und kannst dir das struct sparen:
struct _foo {
} foo;
struct _foo bar;
foo Bar;In C++ benutzt man eigentlich nur noch
struct foo { }; weil das bereits einen neuen Typ deklariert.Ah, ok ist klar. Danke!