struktur und pragma
-
ich habe eine strukture, die so definiert ist
struct meine_struktur { unsigned short referenz; // 2 Bytes WERT wert; // 8 Bytes }; /** definition von WERT**/ typedef union { hyper l_wert; // LONG LONG INT 8 BYTE double d_wert; // DOUBLE 8 BYTE } WERT;
ich verwende diese Strukture "meine_struktur" in einem risiegen Programm und bekomme mit
sizeof(struct meine_struktur) 16 bytes zurück !!! wieso ?
aber die logische speichergrösse ist 10 Bytes (8+2).
in mein Programm wurde diese pragma pack verwendet und die ist für diesen effekt verantwortlich.wie verwende ich #pragma damit nur meine Struktur 10 Bytes gross wird so dass kein einfluss auf den rest meines Programmes ergibt.
so ?
#pragma pack(push, 1) struct meine_struktur { unsigned short referenz_; WERT wert; }; #pragma pack(pop)
ich habe in die hilfe von visual studio nachgelesen aber ich kapiere bis jetzt nicht was die n bei pack(n) genau bewirkt
danke im voraus
youssef
-
z.B. so:
#ifdef _WIN32 // WINNT_40 || Windows2000 #pragma pack (1) ... #pragma pack () #else ... #endif
oder einfach nur so:
#pragma pack (1)
Blackbird
-
Wieso tust du das?
-
youssef schrieb:
ich verwende diese Strukture "meine_struktur" in einem risiegen Programm und bekomme mit
sizeof(struct meine_struktur) 16 bytes zurück !!! wieso ?Strukturen besitzen ein Alignment, dh sie werden im Speicher an gewissen Adressen ausgerichtet. In deinem Fall wird das Alignment vermutlich 8 sein. Deshalb fügt der Compiler nach referenz_ 6 Füllbytes ein, damit wert wiederum aligned ist. Deshalb spuckt sizeof 16 aus.
youssef schrieb:
wie verwende ich #pragma damit nur meine Struktur 10 Bytes gross wird so dass kein einfluss auf den rest meines Programmes ergibt.
Erstmal sollte man wissen, dass #pragma compiler-spezifisch ist. Dh, nicht jeder Compiler muss bzw. wird sowas unterstützen. Deshalb ist es manchmal evtl. besser, dass man unabhängig vom Alignment designed.
Falls du dennoch mit #pragma das Alignment einstellen willst, dann solltest du Folgendes probieren:#pragma pack(1) // Alignment auf 1 setzen - praktisch kein Alignment typedef union { hyper l_wert; // LONG LONG INT 8 BYTE double d_wert; // DOUBLE 8 BYTE } WERT; #pragma pack() // default Alignment struct meine_struktur { unsigned short referenz; // 2 Bytes WERT wert; // 8 Bytes };
-
zuerst danke an euch alle und besonders an groovemaster.
@groovemaster:
das hast super erklärt. ich habe einen interessanten atikel im internet unter http://www.pronix.de/pronix-775.html gefunden und das thema "Alignment" ist mir jetzt klarer geworden.du hast auch völlig recht mit der Alignment 8 . unter projete->einstellungen ist "Struct-Element-Ausrichtung" auf 8 bytes gesetzt und das erklärt die 16 bytes mit sizeof.
ich glaube dass es nicht nötig ist, die alignment für die union zu setzen.
ich möchte sicher sein dass das alignment-setzen nur für die struktur "meine_struktur" gilt und keinenfalls den alignment anderen strukturen oder unionen im programm ändert.
so funktioniert bei mir:#pragma pack(push, 1) struct meine_struktur { unsigned short referenz_; WERT wert; }; #pragma pack(pop)
aber so nicht(program absturz)
#pragma pack(1) struct meine_struktur { unsigned short referenz_; WERT wert; };
youssef