Sida 1 av 1

Strukturers storlek i DevC++

Postat: 17 september 2007, 14:26:05
av bearing
Använder DevC++ och har upptäckt att strukturers storlek blir avrundade till närmaste multipel av 4 bytes. Antar att kompilatorn är 32-bitars och att det är därför.

Det har inneburit problem för mig när jag skriver hela strukturer till filer. Krävs en del fulkod för att strukturen ska skrivas på rätt sätt till filen. Även när filen ska läsas.

Här är ett exempel:

Kod: Markera allt

#include <cstdlib>
#include <iostream>

using namespace std;

struct
{
      char a;
      short b;
      long c;
} ABC;

struct
{
      char d;
      long e;
} DE;

struct
{
      long e;
      long f;
} EF;

int main(int argc, char *argv[])
{
    cout<<"Size of ABC.a: "<<sizeof(ABC.a)<<endl;
    cout<<"Size of ABC.b: "<<sizeof(ABC.b)<<endl;
    cout<<"Size of ABC.c: "<<sizeof(ABC.c)<<endl;       
    cout<<"Size of ABC: "<<sizeof(ABC)<<endl;
    cout<<"Size of DE:  "<<sizeof(DE)<<endl;
    cout<<"Size of EF:  "<<sizeof(EF)<<endl;        
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Utdata blir:

Kod: Markera allt

Size of ABC.a: 1
Size of ABC.b: 2
Size of ABC.c: 4
Size of ABC: 8
Size of DE:  8
Size of EF:  8
Tryck på en valfri tangent för att fortsätta...

Finns det något sätt att få kompilatorn att spara strukturerna på "rätt sätt"?

Postat: 17 september 2007, 14:30:50
av sodjan
Kanske finns någon switch för att stänga av "aligment".
Brukar vara en vanlig optimering...

Postat: 17 september 2007, 14:38:07
av bearing
Tack för hjälpen.
Alignment gick att påverka med ett pragma. Jag lade till följande i början av koden.

Kod: Markera allt

#pragma pack(1)
Då blev utdatan

Kod: Markera allt

Size of ABC.a: 1
Size of ABC.b: 2
Size of ABC.c: 4
Size of ABC: 7
Size of DE:  5
Size of EF:  8
Tryck på en valfri tangent för att fortsätta...

Postat: 17 september 2007, 14:47:39
av AndLi
Borde skrivas in i lektion 1 i programeringsboken, så många som gått rakt ner i den gropen.

Struktar är fina när man försöker hålla styr på sin data internt i sin applikation, men de ställer då till mycket strul när man försöker kommunicera med något utanför sin egna lilla värld...

Postat: 17 september 2007, 14:55:27
av sodjan
Något som man även bör ha koll på är hur "miss-alignments traps"
hanteras av den aktuella plattformen som det ska köras på.

Man kan skjuta sig i foten och få mycket sämre prestanda vid
access av strukturen om man stängar av alignment optimeringen...