SORU
28 Temmuz 2010, ÇARŞAMBA


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
28 Temmuz 2010, ÇARŞAMBA


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ş!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Tinkernut

    Tinkernut

    28 Aralık 2006