Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
09.10.2002, 19:42
Mazze



Hi!

Mir ist kein besseres Subject eingefallen...

Es gab mal so ein Thread, in dem stand, dass
Quellcode:
struct a
{
    int x;
    double d;
    float f;
    int m;
    float z;
    double w;
};

mehr Speicher benötigt als:
Quellcode:
struct b
{
    int x, m;
    double d, w;
    float f, z;
};

Ich weiß nur nicht mehr in welchem Thread das stand....

Das kam mir nun etwas komisch vor und ich war mir ziemlich sicher, dass das nur drauf ankommt, welchen Compiler man nimmt.
Also testete ich das in MSVC und als Ergebnis kam:
Quellcode:
struct a: 32    struct b: 40

Das kann ich mir nicht erklären....

Bei gcc kommt das hier:
Quellcode:
struct a: 32    struct b: 32

Was macht denn MSVC da für scheisse?

thx
Matze

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
001
09.10.2002, 19:54
Archangel



das kommt mir auch komisch vor, da ja die größe jedes datentypens aus den structs sich glatt durch 4 teilen lässt..

aber:

Quellcode:
struct a {
short a;
int b;
short c;
};

struct b {
short a, c;
int b;
};

da dürfte struct a 12, struct b aber nur 8 bytes belegen, wegen 32 bit alignment.. aber mal auf gcc testen

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
002
09.10.2002, 20:41
Tron



dass das erste groeser ist liegt daran, dass double auf 8 byte aligned wird

Quellcode:struct a
{
  int x; // 0-3
  double d; // 8-15
  float f; // 16-19
  int m; // 20-23
  float z; // 24-27
  double w; // 32-39
};

aber wie richtig erkannt, das kann der compiler machen, wie er magt, einzige bedingung: das erste element (hier int x) _muss_ bei position 0 anfangen.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 09.10.2002 um 20:42 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
09.10.2002, 22:02
Diablo_bth



das Byte-Alignment lässt sich (zumindes bei M$VC++) auch manuell einstellen und zwar über
Quellcode:
#pragma pack( Anz_Bytes )

mit #pragma pack( 4 ) müssten beide struct auch bei MS die gleiche größe haben.

damit der Compiler bei C++ nicht meckert kann man auch sowas hier machen:

Quellcode:
#pragma pack( push, 1 )

struct irgendwas
{
  union {
   struct { byte _X; byte _Y; short _Z; };
   struct { __int32 _unused; };
  };
};

#pragma pack( pop )

--

zum Seitenanfang zum Seitenende Profil || Suche
004
09.10.2002, 22:18
the_viking



was soll das mit dem UNION { ... }; ?

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
005
09.10.2002, 23:35
TheTinySteini



union haut alles auf den gleichen Speicherbereich. Quellcode:union {
char a[4];
int b;
}

... würde einen also auf den Speicher von b auch byteweise über das char-Array zugreifen lassen. diablo_bths Teil haut also 2 Bytes und einen Short in den Speicherbereich eines int. Damit hätte man sichergestellt (in Verbindung mit pack 1), dass die Bytes und der Short tatsächlich nur 4 Bytes belegen.

[edit]
Ahso, und um noch etwas mehr Licht ins Dunkel zu bringen:
MSVC hat standartmäßig 8 byte alignment. Daher wird bei struct a der Integer x auf 8 bytes gebracht (is tatsächlich so, hab ich eben ausprobiert), ebenso der float z. Die doubles haben sowieso schon 8 bytes. Dadurch erhält man 40 bytes bei a und 32 bytes bei b. So gibt es auch mein MSVC aus. Mit 4 byte alignment (also #pragma pack( 4 ) ) werden x und z bei 4 bytes belassen und man kommt auch bei a auf 32 bytes.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy


Dieser Beitrag wurde am 09.10.2002 um 23:59 von TheTinySteini bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
10.10.2002, 17:18
Mazze



Naja.

Also so ganz kapiert hab ich den Sinn von Byte-Alignment jetzt doch nicht.
Wieso macht der Compiler das?
Ich denke mal, weil der Datenbus 64 Bit hat.

Aber die müssen doch nicht voll ausgenutzt werden, oder?
Dann wird halt nur die Hälfte geschickt!

Und wieso werden gerade x und z auf 8 Bytes gebracht und nicht z.b. m und f?

Fragen über Fragen....

cu
Matze

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
007
10.10.2002, 17:27
dp
Administrator


pack gibts übrigens auch bei gcc, falls ich das richtig verstanden habe:Quellcode:
typedef struct
{
.. blubb ..
}
__attribute__ ((packed)) foo;

(gehe mal stark davon aus, dass es das gleiche ist..)

--


Dieser Beitrag wurde am 10.10.2002 um 17:27 von Darth Paul bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
10.10.2002, 18:40
Prefect



Mazze: Alignment ist eben dann wichtig, wenn die Variablen nicht in den Bus passen. Du hast ja schon gesagt, der Bus hat eine gewisse Breite (und er wird immer breiter - der scheint gutes Zeug parat zu haben ;)). Angenommen, der Bus ist 64 Bit breit. Dann heißt das bei 99,99% der Architekturen auch, daß der Bus immer Speicher überträgt, der auf 8 Bytes ausgerichtet ist. D.h. in einem Speicherzyklus kannst du den 8Byte-Block von 0-7 oder von 8-15 übertragen, aber _nicht_ den von 4-11 oder von 7-14.
Wenn nun z.B. ein doule (8 Bytes) an der Adresse 7 liegt, dann braucht das System 2 Buszyklen um das double aus dem Speicher zu laden: einen von 0-7 und einen von 8-15.
Deswegen sind aligned Daten prinzipiell schneller (es sei denn du verschwendest durch Alignment gigantisch viel Speicher und trashst damit den Cache). Generell solltest du (zeitkritische) structs einfach so auslegen, daß schon ein natürliches Alignment vorliegt, und der Compiler keinen Platz verschwenden muß.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
009
11.10.2002, 12:25
Mazze



thx

Jetzt hab ich das kapiert!

cu
Matze

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche