“Tüm ekip” C ++ özellikleri?


16

C ++ 'da istisnalar gibi özellikler tüm programınızı etkiler: programınızın tamamında bunları devre dışı bırakabilir veya kodunuz boyunca bunlarla uğraşmanız gerekir. Bir olarak ünlü C ++ Raporuna makale koyar:

Sezgisel olarak, kodlama istisnalarının zor kısmı açık atışlar ve yakalamalar değildir. İstisnaları kullanmanın gerçekten zor kısmı, araya giren tüm kodu, keyfi bir istisnanın atış sitesinden işleyicisine yayılabileceği şekilde, güvenli bir şekilde ve programın diğer bölümlerine zarar vermeden yazılmasıdır.

newİstisnalar bile attığı için, tüm projenizde istisnaları tamamen devre dışı bırakmadıkça , her işlevin temel istisna güvenliği sağlaması gerekir - yalnızca istisna atmayı garanti etmeyen işlevleri çağırmazsa .

Bu nedenle, istisnalar bir "tüm program" veya "tüm takım" özelliğidir, çünkü bunları kullanan bir takımdaki herkes tarafından anlaşılmalıdır. Ama bildiğim kadarıyla tüm C ++ özellikleri böyle değil.

Olası bir örnek, şablon almazsam ancak bunları kullanmazsam, yine de doğru C ++ yazabiliyorum - yoksa almayacak mıyım ?. Hatta sortbir dizi tamsayı arayabilir ve inanılmaz hız avantajı wrt'ın keyfini çıkarabilirim. C'ler qsort(çünkü hiçbir fonksiyon işaretçisi çağrılmaz), risk almadan - ya da değil? Görünüşe göre şablonlar "tam takım" değil.

Kodu doğrudan kullanmayan ve dolayısıyla "tüm ekip" i etkileyen başka C ++ özellikleri var mı? Özellikle C'de bulunmayan özelliklerle ilgileniyorum.

Güncelleme : Özellikle, farkında olmanız gereken, dili uygulayan bir işaretin olmadığı özellikleri arıyorum. İlk takım olan doğruluktan bahsettiğim ilk cevap, bu yüzden herkesin bunu öğrenmesi gerekiyor; ancak, AFAICS yalnızca işaretli bir işlevi çağırırsanız sizi etkiler constve derleyici onu const olmayan nesnelerde çağırmanızı önler, böylece google'a bir şey alırsınız. İstisnalar dışında, bunu bile elde edemezsiniz; dahası, kullandığınız anda daima kullanılırlar new, bu nedenle istisnalar daha “sinsidir”. Ancak bunu objektif olarak ifade edemediğim için, tüm ekip özelliklerini takdir edeceğim.

Güncelleme 2 : C ++ özelliği yerine, çok sayıda anaakım programlama dili için geçerli olan çoklu iş parçacığı gibi şeyleri hariç tutmak için "C ++ 'a özgü özellik" gibi bir şey yazmalıydım.

Ek: Bu soru neden nesneldir (merak ediyorsanız)

C ++ karmaşık bir dildir, bu nedenle birçok proje veya kodlama kılavuzu "basit" C ++ özelliklerini seçmeye çalışır ve birçok kişi bazılarını çoğunlukla öznel kriterlere göre eklemeye veya hariç tutmaya çalışır. Bu konuda sorular doğru burada SO üzerinde düzenli olarak kapalı olsun.

Yukarıda, bunun yerine, (tam olarak olabildiğince) bir "tüm ekip" dil özelliğinin ne olduğunu tanımladım, bir örnek (istisnalar), C ++ ile ilgili literatürde kapsamlı destekleyici kanıt sağladım ve C ++ 'da tüm ekip özelliklerini istedim istisnaların ötesinde.

"Tüm ekip" özelliklerini kullanmanız ya da bunun ilgili bir kavram olup olmaması öznel olabilir - ancak bu sadece bu sorunun öneminin her zamanki gibi öznel olduğu anlamına gelir.

Yanıtlar:


11

Eşzamanlılığı bir 'bütün takım' özelliği olarak aday gösterirdim.

Yazılımı, sadece birkaç uzmanın eşzamanlılık sorunlarının farkında olması gerektiği şekilde tasarlamak mümkün olsa da ve ekibin geri kalanı, karmaşıklıklarla (şablonlarla yapabileceğiniz gibi) ilgilenmeden faydalardan yararlanabiliyor, pratikte bu şekilde çalışmaz. Pratikte, birden fazla iş parçacığınız varsa, o kullanımla ilgili olası eşzamanlılık sorunları varsa, kullandığınız her değişken için dikkatlice analiz etmeniz gerekir.


C ++ 'a özgü olmasa da, iş parçacıklarının tam takım özellikleri olduğunu kabul ediyorum. Bununla birlikte, çoğunlukla diğer dillerde eşzamanlılık (iş parçacığı tabanlı değil) için başka arayüzler de vardır ve birkaç tanesi eşzamanlılığın çok daha iyi kapsüllenmesine izin verir (ancak bu hala programlama dillerinde güncel bir araştırma konusudur). Bu, bunun kendi başına eşzamanlılık için geçerli olup olmadığı konusunda açık bir sorudur.
Blaisorblade

@Blaisorblade - C ++ 11 kendi iş parçacığı kütüphanesini tanıttı, bu yüzden evet, şimdi C ++ 'ın bir parçası.
Michael Kohne

@MichaelKohne: C ++ 'ın multithreading özelliğini desteklemediğini iddia etmedim. Ben diğer pek çok dilde, çünkü konu C ++ özgü olmadığını söyledi. Ben sadece açıklanan sorunları eşzamanlılık için bir arayüz olarak iş parçacığı için geçerli olduğunu kaydetti.
Blaisorblade

"Yarış koşulu" nun bu temel sorun için daha iyi bir kelime olduğunu söyleyebilirim. Yani, programcıların eşzamanlılık çerçevesi üzerinde çalışması veya kullanması gerekmeyebilir, ancak herhangi bir C ++ kodu yazarlarsa ve kodları birden fazla iş parçacığından potansiyel olarak çağrılabilirlerse, genel olarak yarış koşulları hakkında düşünmeleri gerekir, tüm kodlarında yazılı.
rwong

Bana yıllar önce olan bir iş arkadaşınızla yanlış iletişim olduğunu hatırlatıyor. Bir iş arkadaşı başka bir iş arkadaşına sordu: Bu (bazı işlevler) diş için güvenli mi? Diğer iş arkadaşı evet yanıtı verdi. Daha sonra isteyen iş arkadaşınız birden çok iş parçacığından kullanmaya devam etti ve beklenmedik sonuçlar aldı (çökmedi, ancak aynı nesneye birden çok işlem uygulandı). Sorulan iş arkadaşının, "iş parçacığı için güvenli" nin ne anlama geldiğinin zihinsel modeline sahip olmadığı ve yanıtı "İstediğimi yapabilirim" şeklinde yanlış anladığı ortaya çıktı.
rwong

10

Açık cevap constdoğrudur: const/ volatilekalifikasyon bulaşıcı olduğu için, kodun bir kısmı onu kullanmaya başladığında, her (doğrudan veya dolaylı) arama kodu da constdoğru olmalı veya constaçıkça kullanılmamalıdır.

Ancak istisnalarda olduğu gibi, bu sonuçta iyi bir şeydir . Daha da ötesi, istisna güvenliğin aksine derleyici tarafından sıkı bir şekilde doğrulanmıştır.


2
Dahası, - constdoğruluk şeffaftır: sadece bir işleve verdiğiniz tiple ilgilidir (her zaman görünür) ve yanlış yaparsanız derleyici size bağırır. Daha opak şeyler düşünüyordum, çok geç olana kadar bir şeyin yanlış olduğu hakkında hiçbir fikriniz yok (ve o zaman bile bunu anlamak zor olacak). Ama cevabınız yine de ilginç, dolayısıyla iptal edildi.
Blaisorblade

10

İşaretçiler.

  • İşaretçi yığındaki belleği gösteriyor mu?
  • İşaretçi yığıntaki belleği gösteriyor mu?
  • İşaretçi tek bir nesneyi gösteriyor mu?
  • İşaretçi bir diziyi gösteriyor mu?
  • İşaretçi bir dizinin ortasındaki bir yeri gösteriyor mu?
  • İşaretçi geçerli mi?
  • İşaretçi karışık mı?
  • İşaretçinin hangi kodu "sahibi"?
  • Başvurulan nesne el ile yeniden yerleştirilmeli mi? Öyleyse nasıl?

1
İşaretçi sahipliği hakkındaki soru nedeniyle + 1'leyin. Akıllı işaretçiler olmadan sahiplik gerçekten tüm ekip boyunca yayılır.
JKor

3

Başka bir olasılık da operatörün aşırı yüklenmesi. Kod tabanının bir kısmı aşırı yüklenmiş operatörlerle uğraşmaya başladığında, herkes tam olarak çalıştıkları herhangi bir nesnenin gerçekte ne yaptığını tahmin etmeye başlar . İstisnaların ve sabit doğrulukların yaptığı gibi kod tabanından açıkça yayılmaz, ancak tüm ekip aynı sayfada ne zaman, nasıl ve neden kullanılacağı konusunda sorun çıkarmaya başlayabilecek bir şeydir.


1

Akıllara gelen (yukarıda görülen) sabit doğruluktan başka, akış (durum) durumudur. Nesneleri ve alt nesneleri kullandığınız C ++ kodunu yazarsanız ve nesne hiyerarşileri şansınız varsa, sonunda programın operatörüne / operatöründen veri göndermek veya almak istersiniz. Sen edebilirsiniz basit akış yazma işlemleri olacak derlemek ve edecektir semantik doğru ...

std::ostream& operator<< (std::ostream&, MyClass const&) {...}
std::istream& operator>> (std::istream&, MyClass&) {...}

... Ancak bunu yaptıktan sonra, yazmaya çalıştığınız (veya en önemlisi, okuduğunuz) istemcinin size gönderdiği formatla aynı şekilde olduğunu asla garanti edemezsiniz. Akışlarla devam eden çok fazla gariplik vakası var, akışları veya akış bayraklarını işlev çağrı zincirinizin altından argümanlar olarak iletmeniz gerekiyorsa daha da kötüsü… sınıfların akışı genellikle bu şekilde uygulanır. Dolayısıyla akış, yukarıdaki terimi kullandığınız gibi "sinsi" veya belki de "viral" olarak tanımlanabilir ( her ne kadar sabit doğrulukla aynı derecede olmasa da ).

Bir üye sınıf hiyerarşinizin derinliklerinde bir string? Sürpriz, müşteri tek bir kelime gönderir , ya da başka. Serileştirmek istediğiniz bazı numaralarınız mı var? Her fonksiyon çağrısı derinliğinde akış bayraklarını kontrol et, kaydet ve geri yükle daha iyi , çünkü fonksiyonunu çağırmadan önce akışını sekizlik çıkışa ayarlayan aptalın kim olduğunu asla bilemezsin. Ya da daha kötüsü - sadece böyle bir şey arayanın kim setfillve setwböylece ilk -ve biçimlendirmesi de giriş / çıkış kırdı sadece bu devletler çünkü birinci ayrılmaz üyeleri yaymak değil . Oh ve akışlar ve uluslararasılaşma hakkında sormayalım.

Dilde, doğru şekilde veya yanlış şekilde akış yaptığınız , hatta hiç akış yaptığınız konusunda hiçbir uyarı yoktur . Veri yedeklemesine yazmak için bir akışın geçmesi için istemci koduna mı ihtiyacınız var? Akışın işaret ettiğini bilmenin bir yolu yok /dev/null. ( Öte yandan, sen yapabilirsiniz inanılmaz yedekleme hızları ve sıkıştırma oranları bu şekilde iddia! )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.