4.6. inline
Fonksiyonlar
C programı içinde bir fonksiyon çağrısı yapıldığı zaman, çağrının yapıldığı
noktadaki bazı bilgiler (en azından yürütmenin bulunduğu adres ve varsa
argümanlar) yığıta itilir
; çağrısı yapılan fonksiyona geçiş yapılır;
gerekiyorsa fonksiyon içinde tanımlanmış parametre ve yerel değişkenler
için yığıtta yer ayrılır; fonksiyon kodu işletilip, fonksiyondan geri dönüş
yapıldığında ise, daha önce yığıtta saklanmış geri dönüş adresine atlanır ve
eğer varsa, yığıtta saklanmış diğer bilgiler geri alınır. Sonuçta, bir fonksiyon
çağrısı yapmak belli bir oranda maliyet oluşturan bir işlemdir. Çağrılan
fonksiyon büyük ve/veya çağrı sayısı az ise, bu oran düşük kalır ve ciddi bir
performans kaybı olarak karşımıza çıkmaz. Ancak, çok sık çağrılan küçük
fonksiyonlar için bu maliyet oranı daha önemli hale gelebilir.
C Standardına nispeten yeni bir ekleme olan inline
anahtar sözcüğü ile, derleyicinin fonksiyon çağrısı yapmak yerine, ilgili yere
fonksiyon kodunu yerleştirmesi sağlanabilir. Bu şekilde, fonksiyon çağrısı
yapmak yerine, fonksiyonun kodu doğrudan kullanıldığı için, daha verimli bir
yürütme sağlanmış olur.
Örneğin, aşağıdaki satıriçi fonksiyon verilen üç argümandan en büyüğünü döndürür:
static inline double maks (double a, double b, double c) { double m = (a>b) ? a : b; return (m>c) ? m : c; }
Eğer yukarıdaki fonksiyon için derleyiciye verdiğimiz
inline
önerisi, derleyici tarafından dikkate alınırsa,
başka bir fonksiyon içinde yapılan
x = maks(sin(x1), cos(x2), tan(x3));
çağrısı yerine, sanki
{ double a=sin(x1), b=cos(x2), c=tan(x3); double m = (a>b) ? a : b; x = (m>c) ? m : c; }
kodu yazılmış gibi derlenecektir.
Makrolara benzemelerine rağmen, satıriçi fonksiyonlar biraz farklıdır.
Buna rağmen, inline
fonksiyon tanımı aslında
derleyicinin kod üretmesine neden olmaz; sadece fonksiyonun çağrıldığı yerlerde,
ilgili kodu üretip yerleştirmesine neden olur. Bu yüzden, yukarıdaki örneğe
benzeyen satıriçi fonksiyon tanımları, tıpkı makrolar gibi, genelde başlık
dosyalarının içine konulur. Bu şekilde, bu başlık dosyalarındaki tanıma bakarak,
derleyici her fonksiyon çağrısı esnasında fonksiyonu oluşturan kodu
üretebilir.
inline
anahtar sözcüğü, daha önce gördüğümüz
register
anahtar sözcüğü gibi, derleyiciye bir öneri
verir. Derleyicinin böyle bir fonksiyonu gerçekten satıriçi yapıp yapmayacağı
birçok etkene bağlıdır. Ayrıca, tıpkı register
gibi
kullanımı çoğu zaman gereksizdir; eniyileme yapan iyi bir derleyici
normal bir fonksiyonu bile (kullanılan eniyileme seçeneklerine bağlı olarak)
bazı kullanımlarda satıriçi bir fonksiyon olarak derleyebilir.
İçinde döngü içeren veya özçağrılı fonksiyonların satıriçi yapılması
anlamsızdır. Aynı şekilde, farklı dosyalar tarafından kullanılabilecek bir
satıriçi fonksiyon tanımının içinde static
bir değişken
tanımlayıp kullanmak veya fonksiyon dışında tanımlanmış bir
static
değişkeni güncellemek, her dosya için
diğerinden farklı değişken söz konusu olacağı için kafa karıştırıcı
olabilir.