Attributy funkcí
=-=-=-=-=-=-=-=-=-
Opravdoví programátoři nepíšou komentáře. Dalo to práci napsat, ať
to tedy dá práci i přečíst.
K optimalizaci se hodí jakákoliv informace. V některých
případech je celkem těžké, aby optimizer zjistil některé specialitky
a proto mnoho překladačů má možnost přidat k deklaracím funkce i
některé přídavné attributy - například to, že funkce se nikdy
nevrátí (exit) a tak není třeba po jejím volání dále překládat.
Většina z nich to ale řeší pomocí konstrukce #pragma. To přináší
časté potíže s preprocesorem - nejde zahrnovat do maker apod.
Protože je #pragma neportabilní nelze tudíž tyto věci elegantně
přidat do portabilních programů.
GCC má poněkud jiné řešení - pomocí __attribute__ který se píše
za deklaraci funkce. Nastavení takového attributu potom vypadá:
void ahoj(void) __attribute__(const);
Pokud chcete mít program přenositelný, stačí přidat do nějakého
headeru konstrukci:
#ifdef __GCC__
# define CONST(f) f __attribute__const
#else
# define CONST(f) f
#endif
a potom používat pouze:
void CONST(ahoj(void));
Jsou k dispozici následující attributy:
noreturn
říká, že funkce se nikdy nevrátí - jako exit
const
funkce nedělá nic jiného, než že se koukne na své parametry a z
nich vyvodí výsledek, bez dalších vedlejších efektů, nebo
prohlížení paměti. Compiler potom dělá stejné optimalizace jako
na operátor. Příkladem takovych funkcí je například abs, sin,
cos... ale například rand to už není
regparm(počet)
Prvních počet parametrů se bude předávat v registru. To urychlí
volání funkce. GCC umí předávat v registrech i defaultně, je ale
nutné pro to překompilovat knihovny.
constructor
funkce se zavolá před provedením main
destructor
funkce se zavolá před skončením programu
stdcall
funkce bude používat pascalácké volací konvence
cdecl
použijí se C konvence, pokud pascalácké volání je jako default
format(typ,format,odkud)
Funkce typu printf a scanf nemají žádnou kontrolu typů. To je
zdrojem častých chyb a proto GCC umí tyto typy kontrolovat.
Pokud uvedete tento attribut u své funkce, která má stejné
konvence, GCC to bude kontrolovat i tam. Typ může být printf
nebo scanf
unused
Compiler nebude vypisovat warning, kdyz funkce je neppoužita.
weak
Weak je něco jako static nebo global. Pokud v knihovně uděláte
globální proměnou, je vidět zvenku a aplikace ji může omylem
přepsat. Pokud je ale weak, je lokální pro danou knihovnu.
alias(fce)
Funkce je pouze alias pro funkci fce
section(jmeno)
Funkce se uloží do jiné sekce - linker potom může tyto sekci dát
do jiné části výsledku a tak jdou dělat věci jako, že na konci
je inicializační kód, který se potom uvolní z paměti.
výheň