Tupe forviring

Tags:    c++

I min compiler dev-c++, har jeg som udgangs punkt 4 typer variabler der kan inderholde heltal.
char
short
long
long long
(navnene kan naturligvis variere)
De fylder henholdsvis 1, 2, 4 og byte.
Jeg er blevet informeret om at selvom man fx. bruger en short der kun fylder 2 byte, vil den stadig fylde 4 byte.

Kan det virkelig være rigtigt?



Der er ingen garanti for at en short fylder 2 byte eller en int 4.
Der findes faktisk compilere der har 32 bit char, short og int, her fylder de alle 1 byte.
Man kan også have bytes på 11 bit.
På mange 16 bit platforme er int og short 16 bit, mens long er 32 bit.
Men med mingw en en char 8 bit, en byte
short er 16 bit, 2 byte
int er lige som long 32 bit, 4 bytes.

Og det fylder de også i virkeligheden:

Fold kodeboks ind/udKode 




Men bemærk at padding kan gøre at short's kommer til at fylde som en int.

Denne struct vil ofte fylde 16 byte:
Fold kodeboks ind/udKode 


Hvorimod denne ofte vil fylde 12:

Fold kodeboks ind/udKode 




Det er langt fra simpelt. Compileren kan finde på at arrangere hukommelsen totalt mærkeligt, men sikkert af meget gode grunde.
Denne kode:
Fold kodeboks ind/udKode 

...opretter et array på 7 bytes. Det skulle man tro ville blive forstørret til 8 bytes for at overholde 4 bytes alignment. Men følgende assembly blev genereret:
Fold kodeboks ind/udKode 

0x18 er 24 bytes. Jeg har ingen anelse om hvorfor et 7 byte stort array skal fylde 24 bytes, men sådan er det altså åbenbart bare.



t