Tolga: this is sıçartaaa!

Ana sayfa » alloca

Etiketler: alloca bellek yönetimi
Kategoriler: C

Eğer bu C fonksiyonunun ismini ilk defa duyduysanız, buyurun içeri; alloca ile tanışın.

C ile programlama yaparken bellek yönetimi konusunda oldukça titiz davranmanız gerekir. Uygulamanız çalışırken bellek sızıntıları (memory leak) yaratmamalı, uzun (ya da bazen şaşırtıcı kadar kısa) süre çalışınca şişip sistemi süründürmemelidir.

Çoğu zaman bir fonksiyonun içinde yaptığımız şey malloc ile belirli bir yer ayırıp fonksiyondan dönmeden önce bu alanı free ile sisteme geri iade etmektir. Eğer fonksiyon içerisinden, ayırdığımız bu belleği iade etmeden çıkarsak bu fonksiyonu her çağırdığınızda bir miktar bellek kaybederiz ve uygulamamız bir bellek canavarına dönüşür.

Sıradan fonksiyonlar için bu durumu kontrol altında tutmak oldukça kolay olsada, özellikle birden fazla çıkış noktasına sahip olan fonksiyonlarda kodun güzelliğini (elegance), okunabilirliğini (readability) ve bakım kolaylığını (maintenance) sağlamaya çalışmak oldukça zorlayıcıdır.

Bu tür durumlarda uygulayabildiğimiz bir çözüm, fonksiyonların içinde sabit büyüklükte bellek alanları tanımlamaktır.

int f() {
char str[16];
...

Bu kullanımda bellek yönetimini fonksiyon yığınının (function/call stack) içinde yapmış oluruz, fonksiyondan çıkarken serbest bırakmamız gereken herhangi bir bellek alanı olmaz, herşey fonksiyon çağrı yığınının içinde halledilir.

Özellikle gömülü programlama yaparken (embedded programming) oldukça sık kullanılan bu yöntemin dikkatli kullanıldığında hız gibi önemli bir avantajı vardır. Fakat fonksiyonda kullanılacak bellek alanının büyüklüğü parametrik olduğunda, güvenlik (stack buffer overflow) ya da kararlılık (stability) problemleri oluşma olasılığı ortaya çıkacaktır.

İşte bu sorunlara cevap olarak karşımıza yarı standart C fonksiyonu alloca çıkıyor.

void * alloca (size_t size);

alloca’nın yaptığı işi fonksiyon yığınından dinamik yer ayırmak olarak tanımlayabiliriz.

Aşağıdaki örnekte alloca’nın kullanım şeklini görebilirsiniz; örnek fonksiyon, içerisine geçen iki string (karakter katarı derdi hocamız) değişkenini birbirine ekleyerek oluşturduğu isimdeki dosyayı açıp, dosyanın tutacağını (file descriptor) ya da hata oluşması durumunda eksi bir döndürüyor.

int open2 (char *str1, char *str2, int flags, int mode) {
    char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
    stpcpy (stpcpy (name, str1), str2);
    return open (name, flags, mode);
}

Aynı sonucu malloc ve free ile almak isteseydiniz:

int open2 (char *str1, char *str2, int flags, int mode) {
    char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);
    int desc;
    if (name == 0)
        fatal ("virtual memory exceeded");
    stpcpy (stpcpy (name, str1), str2);
    desc = open (name, flags, mode);
    free (name);
    return desc;
}

Gördüğünüz gibi alloca ile gerçekleştirim daha basit. Fakat alloca’nın daha önemli avantajları ve bazı dezavantajları olduğunu da söylememiz gerek.

Avantaj olarak; çalışma hızı ve kullanım kolaylığı (örneğin; birden fazla çıkışı olan fonksiyonlarda bellek temizliği), dezavataj olarak da; her sistemin bu fonksiyonu gerçekleştirecek özelliklere sahip olamaması yani taşınabilirliğinden (portability) bahsedebiliriz.

Kaynak: GNU C Kitaplığı belgelemesi.

Not: alloca’yı fonksiyon çağırırken kullanmayın (önceden tahmin edilemez sonuçlar alırsınız) çünkü alloca’nın kullandığı alan fonksiyona geçen parametrelerin ortasında kalacaktır.

Kaçınmanız gereken kullanıma örnek:

foo(x, alloca (4), y)
« C programlama ortamları

Alakasız (yüksek ihtimal) yazılar


Konuyla ilgili 4 yorum var...

yorumları takip (rss) et

(bu renkli resimlerden bende istiyorum)

  1. 11 Mayıs 2008 / 18:14,
    Ali Demiröz demiş ki:

    Ali Utku hangi bölümden mezun oldugunu sorabilimiyim? “Karakter katarı” hiç yabancı gelmedi de :)

  2. 12 Mayıs 2008 / 09:28,
    Ali Utku Selen demiş ki:

    :) dokuz eylül bilg. müh.

  3. 12 Mayıs 2008 / 17:06,
    Ali Demiröz demiş ki:

    Bende öyle düşünmüştüm…:)

  4. 14 Mayıs 2008 / 11:57,
    Ali Utku Selen demiş ki:

    Bu arada kontrol ettim, karakter katarı tanımını ilk kez Eskişehir’de Gürcan Banger’den duymuşum, kendisi hocam olur.




Sen de yorum yazabilirsin!