Nasıl "nesne" dönmek; C ?
Biliyorum başlık tanıdık geliyor gibi pek çok benzer soru, ama ben istediğim için farklı bir yönü sorunu (biliyorum arasındaki fark olan şeyler koyarak onları yığın ve öbek).
Her zaman başvurular iade edebilirim Java için "yerel" nesneler
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
C , benzer bir şey yapmak için 2 seçenek var
(1) "" bir nesne . iade etmek istiyorum ne zaman başvurular kullanabilirim
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Daha sonra aşağıdaki gibi kullanabilirsiniz
Thing thing;
calculateThing(thing);
(2) Ya da ben dinamik olarak bir nesne işaretçisi . tahsis dönebilirsiniz
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Daha sonra aşağıdaki gibi kullanabilirsiniz
Thing* thing = calculateThing();
delete thing;
Elle, ama benim için bellek boşaltmak zorunda kalmam ilk yaklaşım kullanarak kodun okunmasını zorlaştırır. İkinci yaklaşım sorun, çok güzel görünmüyor mu delete thing;
, hatırlamak zorunda kalacağım. Verimsiz çünkü kopyalanan bir değer dönmek istemiyorum (sanırım), işte soru bu
- Üçüncü bir çözüm (değer kopyalama gerektirmez) var mı?
- Eğer ilk çözüm edersem herhangi bir sorun var mı?
- Neden ve ne zaman ikinci çözüm kullanmalıyım?
CEVAP
Verimsiz çünkü kopyalanan bir değer dönmek istemiyorum
Bunu kanıtlamak.
Rvt li ve NRVO aramak, ve C 0 x-anlambilim hareket. C çoğu durumda 03, dışarıda parametre sadece kodunuzu çirkin yapmak için iyi bir yoldur, ve C 0 x aslında bir parametre kullanarak kendine zarar vermiş olacaksın.
Sadece temiz kod değeri ile geri yazmak. Eğer performans ile ilgili bir sorun varsa, (ortada) profil, ve bunu düzeltmek için neler yapabileceğini görmek. Muhtemelen işlevlerden şeyler dönen olmayacak.
O, eğer böyle yazmaya set ölürsen, muhtemelen parametre yapmak istediğini söyledi. Daha güvenli ve genellikle daha hızlı olan dinamik bellek ayırma, önler. Her zaman tüm nesneler için mantıklı değil işlevi çağırmadan önce nesne oluşturmak için bir yol var gerektirir.
Eğer dinamik ayırma kullanmak istiyorsanız, yapılabilecek en akıllı bir işaretçi koymak. (Bu zaten her zaman yapılmalıdır) O zaman bir şey silme için endişelenme, bazı şeyler özel durum-güvenli, vb. Tek sorun büyük olasılıkla değeri neyse dönerken daha yavaş!
Nasıl "düzgün" JavaScript öz...
Nasıl "bu" JavaScript bir ne...
Nasıl tarif "nesne" jsdoc ba...
Nasıl&; BM-dönmek" geri Git commi...
Nasıl skip "Gevşek Nesne" &#...