dziwny rozmiar struktury

0

Czesc
Szybkie pytanie - dlaczego ta struktura:

struct ST {
	unsigned char t1; //1 bajt
	unsigned long t2; //4 b
	unsigned char t3; //1 b
};

po skompilowaniu programu zajmuje 12 bajtów? Chociaż wydaje sie ze powinna 6.. kompilator bawi sie w dziwne optymalizacje?
Jak moge uzyskac prawdziwy rozmiar?

Cały kod, do szybkiej kompilacji:

#include <stdio.h>

struct ST {
	unsigned char t1;
	unsigned long t2;
	unsigned char t3;
};

int main() {
	printf("%d\n", sizeof(ST)); //wyswietla 12
	return 0;
}

Uzywam VS10, ale z tego co sprawdzilem pod gcc na linuxie jest to samo. Kompletnie tego nie rozumiem :|

0

rozmiar każdego elementu jest wyrównywany do rozmiaru największego elementu w strukturze http://msdn.microsoft.com/en-us/library/71kf49f1(v=vs.80).aspx czyli w tym wypadku do 4B

0

Aha. a da się tego jakoś uniknąć? Czy nie mam na to wpływu?

0

Problem tetrisa, jak klocki nie chcą wejść w danej pozycji to trzeba przestawić :)

struct ST2 {
        unsigned long t2;
        unsigned char t1;
        unsigned char t3;
};
//albo
struct ST3 {
        unsigned char t1;
        unsigned char t3;
        unsigned long t2;
};

Wyrównanie dyktuje największe pole ( long=4B )
Stąd:
[ 1 ][ 2 ][ 3 ][ 4 ][ 1 ][ 2 ][ 3 ][ 4 ][ 1 ][ 2 ][ 3 ][ 4 ]
char ----I am bored :(---- loooooooooooooooooonngg char ----I am bored :(----
loooooooooooooooooonggg char char --Take me!-- I am freeeeee!!! Yay |^^
char char --Take me!-- loooooooooooooooooooong I am freeeeee!!! Yay |^^

( Nie jestem pewien czy jest [char char ------- ] czy [ char ---- char ---- ], chyba to pierwsze ale różnicy nie ma w tym przypadku )

0

@O_o
Akurat przestawienie w tym wypadku mnie nie zadowala, bo kolejność jest istotna dla prawidłowego działania programu.
Ale dzieki za 'wizualizacje' ;)

Problem rozwiazany, dzięki odpowiedzi w linku wyżej.

0

Ewww, się naprodukowałem na darmo ;)

0

Jak moge uzyskac prawdziwy rozmiar?
A po co? Nie należy tego ruszać chyba że ma się istotny powód i wie się co się robi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1