Strukturers storlek i DevC++

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
bearing
Inlägg: 11674
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Strukturers storlek i DevC++

Inlägg 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"?
Senast redigerad av bearing 17 september 2007, 14:31:22, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kanske finns någon switch för att stänga av "aligment".
Brukar vara en vanlig optimering...
bearing
Inlägg: 11674
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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...
Användarvisningsbild
AndLi
Inlägg: 18251
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg 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...
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Skriv svar