Standart C Programlama Dili


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.