5 października 2008

Problemy z typami danych cz II.

Do pomiaru rozmiaru struktur danych służy operator sizeof(). Sprawdzimy na początek ile pamięci zajmują wybrane standardowe typy danych.
#include <stdio.h>

int main(void)
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
return 0;
}
Program wypisze nam ile bajtów zajmuje każdy z następujących typów danych: char, short oraz int. Wyniki zwracane przez program będą różne dla różnych architerktur komputerów na których były uruchomione. Polecam uruchomienie tego programu na własnym komputerze. Na moim komputerze wyniki to: 1 bajt dla chara, 2 bajty dla shorta i 4 bajty dla inta.

Zbadamy teraz ile bajtów zajmują zdefiniowane przez nas struktury danych. Zaczniemy od prostej, lecz często stosowanej konstrukcji.
// Przykład 1

struct struktura
{
char a;
};

sizeof(struktura) == 1;
Wszystko wygląda w porządku. Mamy w strukturze jedną zmienną typu char, która zajmuje 1 bajt. Zatem cała struktura zajmie nam w pamięci 1 bajt. Nic nadzwyczajnego tu się nie dzieje. Przejdźmy do drugiego przykładu.
// Przykład 2

struct struktura
{
char a;
short b;
};

sizeof(struktura) == 4;
Tutaj stało się coś dziwnego.. Zmienna char zajmuje 1 bajt, a zmienna short 2 bajty. Zatem intuicyjnie struktura zawierający te dwie zmienne, powinna zajmować 3 bajty. Natomiast sizeof() informuje nas, że struktura zajmuje aż 4 bajty! Czy to błąd kompilatora albo funkcji sizeof? A może celowe działanie? Spróbuję to wytłumaczyć w dalszej części tego artykułu. Na razie przyjrzyjmy się kolejnemu przykładowi:
// Przykład 3

struct struktura
{
char a;
int b;
char c;
};

sizeof(struktura) == 12;
Pewnie spodziewaliśmy się, że i w tym przypadku rozmiar struktury będzie nieco większy niż wynikałoby to z prostej matematyki. Ale że struktura będzie zajmowała dwa razy więcej miejsca niż zmienne w strukturze? I to jeszcze nie koniec! Przyjrzyjmy się kolejnemu przykładowi.
// Przykład 4

struct struktura
{
char a;
char c;
int b;
};

sizeof(struktura) == 8;
Struktura z praktycznego punktu widzenia nie różni się tak bardzo od poprzedniej. I tu i tu mamy po dwa chary i jednego inta. Zmienne nawet w obu przypadkach są tak samo nazwane! Różnica jest jedynie w kolejności w jakiej te zmienne występują. Dzięki tej z pozoru nieistotnej zmianie zyskaliśmy aż 4 bajty w pamięci. Dlaczego tak się dzieje? O tym w kolejnej części.

Brak komentarzy: