Bir işaretçiyi iletmek yerine yapıları C değerine göre geçirmenin dezavantajları var mı?
Yapı büyükse, çok sayıda veri kopyalamanın performans açısından açık bir yönü vardır, ancak daha küçük bir yapı için, temel olarak bir işleve birkaç değer iletmekle aynı olmalıdır.
Dönüş değerleri olarak kullanıldığında daha da ilginç olabilir. C'nin işlevlerden yalnızca tek dönüş değerleri vardır, ancak genellikle birkaçına ihtiyacınız vardır. Yani basit bir çözüm onları bir yapıya koymak ve geri vermek.
Buna karşı veya buna karşı bir neden var mı?
Burada bahsettiğim herkese açık olmayabileceğinden, basit bir örnek vereceğim.
C dilinde programlama yapıyorsanız, er ya da geç aşağıdaki gibi işlevler yazmaya başlayacaksınız:
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, tüm fonksiyonlarda aynı kuralı kullanmanız için parametrelerin hangi sırada olması gerektiği konusunda iş arkadaşınızla anlaşmanız gerektiğidir.
Ancak aynı tür bilgileri geri döndürmek istediğinizde ne olur? Genellikle böyle bir şey alırsınız:
char *get_data(size_t *len);
{
...
*len = ...datalen...;
return ...data...;
}
size_t len;
char *p = get_data(&len);
Bu iyi çalışıyor, ancak çok daha sorunlu. Bir dönüş değeri, bu uygulamada olmaması dışında bir dönüş değeridir. Yukarıdan, get_data fonksiyonunun neye işaret ettiğine bakmasına izin verilmediğini söylemenin bir yolu yoktur. Ve derleyiciyi bu işaretçiden bir değerin gerçekten döndürüldüğünü kontrol eden hiçbir şey yoktur. Gelecek ay, bir başkası kodu doğru anlamadan değiştirdiğinde (belgeleri okumadığından dolayı?) Fark etmeden kırılır veya rastgele çökmeye başlar.
Yani, önerdiğim çözüm basit yapı
struct blob { char *ptr; size_t len; }
Örnekler şu şekilde yeniden 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 olarak examine_data bir yapı blob için bir işaretçi almak istiyorum düşünüyorum, ama neden görmüyorum. Hala bir işaretçi ve bir tam sayı alır, birlikte gittikleri çok daha açıktır. Ve get_data durumunda, uzunluk için herhangi bir girdi değeri olmadığından ve döndürülen bir uzunluk olması gerektiğinden, daha önce tanımladığım şekilde karıştırmak imkansızdır.
gettimeofday
) tüm sistem arayüzleri bunun yerine işaretçileri kullanır ve insanlar bunu örnek olarak alır.
void examine data(const struct blob)
için yanlış.