SORU
28 Temmuz 2015, Salı


Oluşturma "dersleri" C, vs yığın yığın?

Her ne zaman ben bir C "(ilk argüman olarak bir işaretçi alır erişme işlevleri tarafından kullanılmak üzere tasarlanmıştır herhangi bir yapı görüyorum onları bu şekilde uygulanan:." sınıfına bakın

typedef struct
{
    int member_a;
    float member_b;
} CClass;

CClass* CClass_create();
void CClass_destroy(CClass *self);
void CClass_someFunction(CClass *self, ...);
...

Ve bu durumda CClass_create mallochafıza ler ve bunun için bir işaretçi döndürür.

new C gelip gereksiz yere ne zaman görsem, genellikle C programcıları deli gibi görünüyor, ama bu uygulama C kabul edilebilir Ne veriyor? Orada yığın ayrılan "kadar yaygın?" sınıfları yapı neden arkasındaki nedeni

CEVAP
28 Temmuz 2015, Salı


Bunun birçok sebebi vardır.

  1. "Donuk" işaretçiler
  2. Eksikliği yıkıcılar
  3. Gömülü sistemler (yığın taşması sorunu)
  4. Kaplar
  5. Atalet
  6. "" . Tembellik

Onlara kısaca tartışalım.

İçinopak işaretçilersen gibi bir şey yapmak için sağlar:

struct CClass_;
typedef struct CClass_ CClass;
// the rest as in your example

Yani, kullanıcı struct CClass_, tanımı yapılan değişiklikler onu izolasyon ve diğer ilginç şeyler sağlayarak, farklı sınıf, farklı platformlar için uygulama gibi görmüyor.

Tabii ki, bu yığın CClass değişkenleri kullanarak yasaklar. Ama, OTOH, bu CClass nesneleri statik olarak (bilardo) tahsis yasaklamak değil - CClass_create tarafından döndürülen ya da belki CClass_create_static gibi başka bir işlev görebilir.

Eksikliği yıkıcılarC derleyici otomatik olarak CClass yığın nesneleri imha olacak bu yana, yapmanız gereken kendinizi (el ile yıkıcı işlevi çağrılıyor). Yani, sadece parası sola yığın ayırma, genel olarak, daha hızlı yığın ayırma daha olmasıdır. OTOH, gerek yok kullanın öbek - tahsis bir havuz veya bir arena, ya da onun gibi bir şey, ve bu neredeyse kadar hızlı yığın ayırma olmadan potansiyel sorunların yığın ayırma tartışılan aşağıda.

Gömülü sistemler- Bir yığın "" kaynak, biliyorsun. sonsuz değildir Tabii, bugünkü "neredeyse." İşletim sistemleri (POSIX, Windows...), Düzenli çoğu uygulama için Ama, gömülü sistemler, yığın birkaç KBs kadar düşük olabilir. Bu aşırı, ama daha "büyük MBs olan" yığın gömülü sistemler. Bu yüzden daha fazla kullanılırsa tükendi. Yok, çoğunlukla ne olacağının garantisi yok - AFAIK, hem de C ve C "Tanımsız davranış". OTOH, CClass_create() bellek yetersiz olduğunda NULL işaretçi dönmek ve bu işi sen yapabilirsin.

Kaplar- C kullanıcıların ayırma yığını gibi, ama, eğer yığını std::vector oluşturursanız, içindekileri yığın tahsis edilecektir. Sen-ebilmek tweak bu, elbette, ama bu varsayılan davranış, ve yapar olanlar hayat çok daha kolay ki "bütün üyelerinin bir konteyner bir yığın ayrılan" yerine anlamaya çalışıyorum nasıl bir tanıtıcı değil.

Atalet- OO SmallTalk geldi. Her şey dinamik, yani, "C" çeviri "yığın". her şeyi " doğal. Böylece, ilk örnekleri de öyle oldu ve yıllardır başkaları için esin kaynağı olmuştur.

"Tembellik"Eğer yalnızca bir nesneler yığını istiyorum biliyorum - bir şey gerekir:

CClass CClass_make();
void CClass_deinit(CClass *me);

Ama, eğer her iki yığın ve öbek izin vermek istiyorsanız, eklemek gerekir:

CClass *CClass_create();
void CClass_destroy(CClass *me);

Bu uygulayıcısı yapmak için daha fazla iş, ama aynı zamanda kullanıcı için kafa karıştırıcı. Biri biraz farklı arayüzleri yapabilir, ama işlevleri iki set ihtiyacınız olduğu gerçeğini değiştirmiyor.

Tabii ki, "sebebi de kısmen bir" "neden. tembellik" konteyner

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesomesauce Network

    Awesomesauce

    4 EKİM 2012
  • ExcelTutorials

    ExcelTutoria

    2 Mayıs 2009
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010