SORU
2 EKİM 2008, PERŞEMBE


C değeri yerine bir işaretçi geçerek yapılar, yoldan geçen herhangi bir dezavantajı var mı?

C değeri yerine bir işaretçi geçerek yapılar, yoldan geçen herhangi bir dezavantajı var mı?

Eğer yapı çok büyükse, belli miktarda veri kopyalama performancd yönü de vardır, ama daha küçük bir yapı için, temelde bir işlev için birkaç değerleri geçirmeden aynı olmalıdır.

Dönüş değerleri olarak kullanıldıĞında belki daha da ilginçtir. C fonksiyonlarını tek tek dönüş değerleri vardır, ama genellikle birkaç gerekir. Çok basit bir çözüm bir yapı içinde iade etmek.

Ya da buna karşı herhangi bir sebep var mı?

Burada bahsettiğim şey herkes için aşikar olmayabilir beri, basit bir örnek vereyim.

Eğer C programlama iseniz, er ya da geç bu gibi işlevleri yazmaya başlarsın:

void examine_data(const char *ptr, size_t len)
{
    ...
}

char *p = ...;
size_t l = ...;
examine_data(p, l);

Bu bir sorun değil. Tek sorun hangi sipariş parametreleri tüm fonksiyonları aynı kullandığınızdan yani iş arkadaşınız ile aynı fikirde olmak zorunda olduğunu.

Ama bilgi aynı tür iade etmek istediğinizde ne olur? Genellikle bu gibi bir şey:

char *get_data(size_t *len);
{
    ...
    *len = ...datalen...;
    return ...data...;
}
size_t len;
char *p = get_data(&len);

Bu gayet iyi çalışıyor, ama çok daha sorunlu. Dönüş değeri, geri dönüş değeri, bu uygulama içinde değil dışında. İşlev get_data len ne işaret bakmak için izin verilmez yukarıdan söylemek yolu yoktur. Ve derleyici bir değer aslında bu işaretçi döndürülür olmadığını kontrol edin kılan bir şey yok. Gelecek ay, başka biri düzgün (belgeleri okumak için mi?) anlamadan kodu değiştirir yani kimse fark etmeden kırık olur, ya da rastgele çökmesini başlar.

Yani çözüm önerim basit yapı

struct blob { char *ptr; size_t len; }

Bu örnekler, bu gibi yazılabilir:

void examine_data(const struct blob data)
{
    ... use data.tr and data.len ...
}

struct blob = { .ptr = ..., .len = ... };
examine_data(blob);

struct blob get_data(void);
{
    ...
    return (struct blob){ .ptr = ...data..., .len = ...len... };
}
struct blob data = get_data();

Nedense, çoğu insan içgüdüsel bir yapı blob için bir işaretçi almak examine_data olacağını düşünüyorum, ama neden görmüyorum. Hala bir işaretçi alır ve bir tamsayı, onlar birlikte gitmek çok daha net. Ve get_data durumda uzunluğu için giriş değeri yoktur beri imkansız önce tarif ettiğim şekilde karışıklık ve iade uzunluğunda olmalı.

CEVAP
2 EKİM 2008, PERŞEMBE


Değeri küçük yapılar (örn noktası, rect için geçen mükemmel kabul edilebilir. Ama, hız dışında, dikkatli/değeri büyük yapılar dönen geçen olmalıdır için bir başka neden daha var: Yığın alanı.

Bir sürü C programlama için gömülü sistemler, hafıza nerede olduğunu bir prim, ve yığın boyutları olabilir ölçülen KB hatta Bayt... Eğer geçen veya dönen yapılar tarafından değer, kopya bu yapılar olacaktır yerleştirilen yığın, potansiyel neden olan durum this site adında sonra...

Eğer aşırı kullanımı yığını gibi bir uygulama görürsem, yapılar değer tarafından geçirilen ilk baktığım şeylerden biridir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • sghaff1

    sghaff1

    23 Mart 2009
  • theKGB65

    theKGB65

    24 Aralık 2007