JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=627bb2365ac23caf055742da5e4729a1Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[Visual C++] Probleme mit Struktur-/Klassengrößen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Christian Rousselle
Site Admin


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 02.06.2004, 20:40    Titel: [Visual C++] Probleme mit Struktur-/Klassengrößen Antworten mit Zitat

Frage:

Wenn ich eine Struktur definiere, die folgendermaßen aussieht:

Code:

struct foo
{
   float x, y, z;
   BYTE b;
};


dann hat eine Instanz der Struktur eine Größe von 16 Byte, wobei sie eigentlich nur 13 Byte haben sollte.

Was kann ich tun? Ich bin so verzweifelt. Confused

Antwort:

Der Compiler legt Instanzen der Struktur aus Performancegründen (je nach Compilereinstellung) 4 bzw. 8 Byte-Aligned (ausgerichtet) an, da er so schneller auf die Struktur zugreifen kann. Dies hat mit der 32-/64-Bit Architektur des Prozessors zu tun. Wenn Instanzen der Struktur mit ihrer tatsächlichen Größe benötgt werden, kann folgende Lösung verwendet werden.

Code:

#pragma pack(1)
struct foo
{
   float x, y, z;
   BYTE b;
};
#pragma pack(4)


Dadurch wird das Alignment für die Struktur auf ein Byte gesetzt. Durch die Anweisung #pragma pack(4) anschließend wieder auf 4. Da das Alignment aber Compilerabhängig ist, empfiehlt es sich folgende Definition zu verwenden:

Code:

#pragma pack (1 , push)
struct foo
{
   float x, y, z;
   BYTE b;
};
#pragma pack (pop)


Dadurch wird das ursprüngliche Aligment wieder hergestellt.

........................<edit KI>........................

Den selben Effekt erreicht man übrigens durch das inkludieren eines
pshpack Headers. Das geht so:
Code:

#include <pshpack1.h>
struct foo
{
   float x, y, z;
   BYTE b;
};
#include <poppack.h>


Bemerkung:
Die Verwendung der #pragma Anweisung ist Compilerabhängig.

Es gibt pshpack1.h, pshpack2.h, pshpack4.h und pshpack8.h.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 33
Anmeldedatum: 17.02.2003
Beiträge: 3430
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.11.2005, 13:53    Titel: Antworten mit Zitat

Ich beziehe mich im folgenden auf:
Zitat:

[Visual C++] Probleme mit Struktur-/Klassengrößen


Zitat:

Der Compiler legt Instanzen der Struktur aus Performancegründen (je nach Compilereinstellung) 4 bzw. 8 Byte-Aligned (ausgerichtet)


der Compiler macht das nicht nur deswegen, sondern auch, weil manche Architekturen (eigentlich alle ausser x86, AFAIK) nur an ihren word-grenzen (word-grenze auf i386 z.B. 32bit) Speicher ansprechen koennen.
GCC aendert dann die Speicherzugriffe enstprechend in der resultierenden binary bei solchen Platformen aber andere Compiler machen dies nicht immer was zu schwerwiegenden Problemen auf diesen Architekturen fuehren koennte.

Zitat:

Die Verwendung der #pragma Anweisung ist Compilerabhängig.


genau auf gcc sollte man:
CPP:
struct foo
{
   float x, y, z;
   BYTE b; // ich vermute mal unsigned char auf den meisten implementierungen
} __attribute__((packed));

benutzen.

MFG

Johannes

EDIT: tags fixed

http://www.jliforum.de/board/viewtopic.php?t=4149
_________________
http://www.C3-Soft.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum