Şimdi Ara

C++ kullanırken göz önünde neler bulundurulmalı?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
3
Cevap
0
Favori
909
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar,
    Visual C++ (ve bazı .Net kütüphaneleri) kullanarak TCP üzerinden haberleşecek bir sunucu yazmakla meşgulüz. Yabancı forumlarda (daha çok soru & cevap platformlarında) gördüğüm birkaç yorumdan ötürü bu yolu izlerken neleri dikkate almamız gerektiğiyle ilgili sizlere sormak istedim. Her sınıfımızı Managed olarak tasarladık. Managed'in ne anlama geldiği anlamış değilim, açıp okumadım da, verdiği hatalardan yola çıkarak yaptığım varsayımlarla düzelttim birçok şeyi. Ama özetleyecek olursak, hiçbirşekilde düz pointer kullanmadık, array<T> kullandık, yeni obje oluştururken gcnew kullandık, hiçbirşeyi delete etmedik (gcnew kullanınca delete etmek gerekip gerekmediğini araştırmayışımızdan ötürü). Memory management'la ilgili olsun, genel olarak C++ veya .Net ile ilgili olsun, önerileriniz, tavsiyeleriniz varsa çok memnun olurum (z) duymaktan.
    İyi geceler.







  • welrocken W kullanıcısına yanıt
    "Managed" dediği şey bir nevi "Memory Management". Yani "managed" modda yaratılmış objeleri "delete" ile destructoru çağırıp hafızadan silme ve işletim sistemine programcının "Bu objenin işgal ettiği hafızayı ve kaynakları artık benim programım kullanmıyor, bilginize" haberini verme yükümlülüğünden kurtarıyor, dolayısıyla (güya) hatalı program yazma oranını azaltıyor(muş).

    Ben olsam server gibi zamana bağımlı kritik işler yapan programlarda mümkün mertebe daha fazla hakimiyet açısından "managed" modu kullanmazdım. Çünkü programın hafıza düzenleyicisinin ne zaman devreye girip kullanılmayan objeleri temizlemeye başlayacağı belirsiz olabilir. Bu da o esnada işlemci zamanından çalacağı için programda takılmalara, darboğazlara yol açabilir kaygısından dolayı.

    Ha belki server'a 10 kişi bağlandığında başlarda birşey olmayabilir, ne var ki server'a mesela 1000 kişi bağlandığı zaman bu "managed" objelerin temizlenme işi programda ciddi takılmalara yol açıp çirkin yüzünü çok geç ve kötü bir şekilde gösterebilir endişesi bendeki...

    Bir araştırmak lazım aslında bende tam bilemiyorum, belki "managed" modda hafızayı mümkün mertebe takılmalara yol açmadan belki nebiliim daha sık aralıklarla temizleyebilme modlarını tanımlamak böylelikle programda potansiyel olarak ortaya çıkabilecek "jerky behavior"dan tamamen kurtulmak belki mümkündür. Veya tabii artık yıl olmuş 2015, hem bilgisayarlar da artık oldukça hızlı, her bakımdan bu hadise artık hem yazılımsal hem de donanımsal olarak çözülmüş endişe etmeye mahal yoktur belki...




  • quote:

    Orijinalden alıntı: Buzz Lightyear

    "Managed" dediği şey bir nevi "Memory Management". Yani "managed" modda yaratılmış objeleri "delete" ile destructoru çağırıp hafızadan silme ve işletim sistemine programcının "Bu objenin işgal ettiği hafızayı ve kaynakları artık benim programım kullanmıyor, bilginize" haberini verme yükümlülüğünden kurtarıyor, dolayısıyla (güya) hatalı program yazma oranını azaltıyor(muş).

    Ben olsam server gibi zamana bağımlı kritik işler yapan programlarda mümkün mertebe daha fazla hakimiyet açısından "managed" modu kullanmazdım. Çünkü programın hafıza düzenleyicisinin ne zaman devreye girip kullanılmayan objeleri temizlemeye başlayacağı belirsiz olabilir. Bu da o esnada işlemci zamanından çalacağı için programda takılmalara, darboğazlara yol açabilir kaygısından dolayı.

    Ha belki server'a 10 kişi bağlandığında başlarda birşey olmayabilir, ne var ki server'a mesela 1000 kişi bağlandığı zaman bu "managed" objelerin temizlenme işi programda ciddi takılmalara yol açıp çirkin yüzünü çok geç ve kötü bir şekilde gösterebilir endişesi bendeki...

    Bir araştırmak lazım aslında bende tam bilemiyorum, belki "managed" modda hafızayı mümkün mertebe takılmalara yol açmadan belki nebiliim daha sık aralıklarla temizleyebilme modlarını tanımlamak böylelikle programda potansiyel olarak ortaya çıkabilecek "jerky behavior"dan tamamen kurtulmak belki mümkündür. Veya tabii artık yıl olmuş 2015, hem bilgisayarlar da artık oldukça hızlı, her bakımdan bu hadise artık hem yazılımsal hem de donanımsal olarak çözülmüş endişe etmeye mahal yoktur belki...

    Hocam valla neredeyse pure C++ kullanmamamızın tek nedeni, boost.asio'nun kullanım zorluğu. TCP/IP için saatlerce uğraştırdı bizi sözde Visual Studio'yla uyumlu çalışıyormuş bilmemneymiş, bir ton şey denedik (bootloader mı yapmışlar birşey adını da unuttum, onu çalıştırdık yarım saat bi saat sürdü) sonra çalışmadı benim bilgisayarımda çalıştı arkadaşımınkin de çalışmadı falan. Biz de dedik madem öyle .Net kullanalım kolay olur. Zaten server base'i komple pure C++'da yazmıştık, pointer -> array'ler vs. herşeyi de doğruca manage ettiğimizi düşünüyorum, bir yerde index hatasından (byteArrayToInt tadında bir fonksiyon yazarken) memory ile ilgili (Heap corruption ? ) hata aldık, o da zaten ne allocation ne de de-alloc ile ilgiliydi. Baya bi takip ettik, bişeyi yanlış silmeyelim, veya askıda bırakmayalım diye. Sonra boost.asio satınca, oturup her un-managed entity'e converter yazmak yerine bütün projeyi managed'e çevirdik. Neyseki çok ilerlememiştik. Şimdi buraya kadar geldikten sonra tekrar dönebileceğimizi sanmıyorum, muhtemelen bir süre böyle kullanmak zorunda kalıcaz. C++ hakkında çok az bilgim var arduino'dan kalma, baya temel sayılır bilgilerim, umuyorum bahsettiğiniz sorunlarla karşılaşmayız.

    Benim şüphelerim var Visual C++ + .Net'in performans yönünden saf C++'a yakın çalışabileceğinden, performansını araştırmadım, sadece .Net içeriğinden varsayıyorum. Onun dışındaki bahsettiğiniz şeylerle karşılaşmamız durumunda ne yapacağız açıkçası hiçbir fikrim yok. Teşekkür ederim cevabınız için, iyi sabahlar.




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.