SORU
16 EYLÜL 2011, Cuma


Dinamik bellek ayırma popüler uygulamaları C ve C farkı nedir?

İlgili dil standartları kadar, C C ayırma en yaygın biçimi ::operator new() olarak gerçekleştirilirken, yalnızca dinamik hafıza ayırma malloc() aile ile sunuyor. C-stil malloc de kullanılabilir, C , ve birçok "bebeğin ilk ayırıcısı" örnek kullanım olarak çekirdeği ayırma işlevi, ama ben merak ediyorum nasıl çağdaş Derleyiciler uygulamak gerçek üretim operatörü-yeni.

Sadece malloc(), etrafında ince bir sarıcı veya temelde oldukça farklı bir bellek ayırma dolayı farklı bir şekilde uygulanır tipik bir C programına göre tipik bir C programının bir davranış mı?

[Düzenleme:Temel fark şu şekilde genellikle tarif olduğuna inanıyorum: Bir C programı, daha az, daha büyük, C program birçok sahipken uzun ömürlü ayırma, küçük, kısa ömürlü ayırma. Eğer bir yanlış varsa lafa girebilirsin, ama kimse bunu dikkate alarak yararlanacak gibi görünüyor.]

Bir derleyici GCC gibi olur kolay sadece tek bir çekirdek ayırma uygulaması ve kullanımı için ilgili tüm diller, çok merak ediyorum eğer farklılıklar söz konusudur detayları denemek için optimize edilen ayırma performansı her dil.


Güncelleme:Tüm büyük cevaplar için teşekkürler! GCC bu tamamen tarafından çözülmüş gibi görünüyorptmallocMSVC da özünde malloc kullanan ve. Herkes MSVC-malloc nasıl uygulanır biliyor mu?

CEVAP
16 EYLÜL 2011, Cuma


İşte uygulaması g 4.6.1 tarafından kullanılan:

_GLIBCXX_WEAK_DEFINITION void *
operator new (std::size_t sz) throw (std::bad_alloc)
{
  void *p;

  /* malloc (0) is unpredictable; avoid it.  */
  if (sz == 0)
    sz = 1;
  p = (void *) malloc (sz);
  while (p == 0)
    {
      new_handler handler = __new_handler;
      if (! handler)
#ifdef __EXCEPTIONS
        throw bad_alloc();
#else
        std::abort();
#endif
      handler ();
      p = (void *) malloc (sz);
    }

  return p;
}

Bu g kaynak dağıtımı içinde libstdc -v3/libsupc /new_op.cc bulunur.

Gördüğünüz gibi, malloc çevresinde oldukça ince bir sarıcı.

editBirçok sistemlerde genellikle mallopt arama veya ortam değişkenleri ayarlayarak ince ayar malloc, davranışları mümkündür. Burada 15 ** bazı özellikleri Linux üzerinde kullanılabilir tartışıyor.

2.3 ayırıcısı değiştirilmiş bir sürümü kullanın *16,** *11 sürümleri dlmalloc türev Doug Lea tarafından tasarlanan kendisi olan ptmalloc denir. İlginç olan, article about dlmalloc Doug bir Lea içinde verir aşağıdaki perspektif (vurgu benim):

Bazı C yazdıktan sonra ayırıcısı ilk versiyonunu yazdım neredeyse sadece dayanıyordu programları ayırma Dinamik Bellek. Çok daha yavaş ve/veya çok fazla toplam koştular bulundu bellek tüketimi ben daha onları bekliyordu. Bu nedeniyle oldu bellek özellikleri koşuyordum sistemlerinde oran (SunOs ve BSD en güncel ağırlıklı sürümleri ). Sayacı bu, ilk özel amaçlı bir dizi C ,oran yazdım normalde çeşitli sınıflar için yeni operatör aşırı yükleme. Bazı bu bir C ayırma teknikleri ile ilgili bir makale olarak açıklanmıştır 1989 C Rapor madde içine adapte Bazı depolama ayırma konteyner sınıflar için teknikler.

Ancak, ben her biri için özel bir ayırıcı bina yakında hayata dinamik olarak tahsis edilen ve yoğun olarak kullanılan olma eğilimi olan yeni bir sınıftı genel amaçlı her türlü yapı iyi bir strateji programlama zamanda yazıyordum sınıfları destekler. (1991, 1986 bu libg birincil yazar , GNU C kütüphanesi.) Bir daha geniş çözüm yazmak için gerekliyeterince iyi bir ayırıcı normal C ve C yük altındaprogramcılar cazip olabilir çok özel altında hariç amaçlı özel oran yazmak koşulları.

Bu makalede, ana tasarım hedefleri bazıları,bir açıklama sunar algoritmalar ve bu ayırıcı uygulama konuları.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • Jorrit Jongma

    Jorrit Jongm

    17 Ocak 2008
  • Orson Wang

    Orson Wang

    28 EKİM 2006