1. sizeof
operaatori ülevaade
C-keele sizeof
operaatorit kasutatakse andmetüübi või muutuja poolt hõivatud mälumahu (baitides) väljaselgitamiseks. See on oluline tööriist mäluhalduse ja andmestruktuuride optimeerimisel ning võimaldab kirjutada platvormist sõltumatut koodi.
2. Mis on sizeof
operaator?
sizeof
põhiline kasutamine
sizeof
operaator tagastab määratud andmetüübi või muutuja mälumahu baitides. Näiteks saab seda kasutada põhityüpide (int
, char
, float
jne) suuruse kontrollimiseks.
int a;
printf("%zu\n", sizeof(a)); // Väljundab int-tüüpi suuruse
printf("%zu\n", sizeof(int)); // Väljundab int andmetüübi suuruse
sizeof
omadused
sizeof
hinnatakse kompileerimise ajal, mistõttu see ei mõjuta programmi töökiirust. Samuti aitab see kirjutada teisaldatavat koodi, kuna erinevatel platvormidel võivad andmetüüpide suurused varieeruda.
3. sizeof
kasutamise põhialused
Massiivid ja sizeof
Kui kasutada sizeof
massiivi peal, saadakse massiivi kõigi elementide kogusuurus (elementide arv × iga elemendi suurus). Seda saab kasutada ka elementide arvu leidmiseks massiivis.
int arr[10];
printf("%zu\n", sizeof(arr)); // Väljundab kogu massiivi suuruse
printf("%zu\n", sizeof(arr) / sizeof(arr[0])); // Arvutab massiivi elementide arvu
Pointerid ja sizeof
Kui kasutada sizeof
pointeri peal, saadakse pointeri enda suurus, mitte selle poolt osutatud andme suurus. Seda tuleb arvestada pointeritega töötamisel.
int *ptr;
printf("%zu\n", sizeof(ptr)); // Väljundab pointeri enda suuruse
printf("%zu\n", sizeof(*ptr)); // Väljundab pointeri osutatud andme suuruse
4. sizeof
kasutamine struktuuridega
Struktuuri suuruse leidmine
Struktuurid ühendavad erinevaid andmetüüpe ja sizeof
abil saab leida struktuuri mälumahu. Struktuuri suurus võib olla suurem kui liikmete summa, kuna see sõltub ka mäluaadresside joondusest (memory alignment).
typedef struct {
char name[50];
int age;
} Person;
printf("%zu\n", sizeof(Person)); // Väljundab struktuuri suuruse
Mäluaadresside joondus ja suuruse muutus
Struktuuri suurus võib mäluaadresside joondamise tõttu olla suurem kui liikmete summa. Kompilaator võib lisada täitebaiti (padding), et tagada efektiivne mälu kasutus.

5. sizeof
ja mäluaadresside joondus
Mäluaadresside joondamise olulisus
Mäluaadresside joondus (memory alignment) tähendab andmete paigutamist mällu nii, et nendele oleks kiire ligipääs. Kui joondus pole korrektne, võib programmi jõudlus kannatada.
_Alignof
operaatori erinevus
sizeof
tagastab mälumahu, samas kui _Alignof
operaator annab andmetüübi vajaliku minimaalse joondusväärtuse. See aitab paremini mõista, kuidas andmed mälus paigutuvad.
typedef struct {
char a;
int b;
} AlignedStruct;
printf("%zu\n", sizeof(AlignedStruct)); // Väljundab struktuuri suuruse
printf("%zu\n", _Alignof(AlignedStruct)); // Väljundab struktuuri joondusväärtuse
6. sizeof
kasutamisel ettevaatusabinõud ja parimad praktikad
Platvormidevaheline ühilduvus
Erinevatel platvormidel ja kompilaatoritel võivad andmetüüpide suurused olla erinevad. sizeof
kasutamine võimaldab kirjutada koodi, mis töötab sõltumata platvormist.
Dünaamilise mäluhaldusega sizeof
Dünaamilise mäluhalduse puhul kasutatakse malloc
koos sizeof
-iga, et reserveerida õige kogus mälu. Nii välditakse mälupuudust ja puhvri ületäitmist.
int *arr = (int *)malloc(10 * sizeof(int)); // Dünaamiline mäluhaldus
7. sizeof
praktilised kasutusnäited
Mäluhalduse optimeerimine
sizeof
võimaldab arvutada puhvrile täpse suuruse, mis on oluline näiteks failide lugemisel või võrgusuhtluses andmete salvestamisel.
char *buffer = (char *)malloc(100 * sizeof(char)); // Puhvri suuruse määramine
Andmestruktuuride optimeerimine
Andmestruktuure kavandades saab sizeof
abil hinnata iga andmetüübi mälu kasutust ja parandada koodi efektiivsust.
8. Kokkuvõte
sizeof
operaator on C-keeles mäluhalduse põhivahend, mis aitab kirjutada turvalist ja efektiivset koodi. Selles artiklis selgitasime sizeof
kasutamise aluseid, selle rolli struktuurides ja joondamises ning parimaid praktikaid. Õige kasutamise korral võimaldab see kirjutada teisaldatavat ja töökindlat koodi.