Soru Boost'u mu yoksa standart lib'i mi tercih edelim? [kapalı]


Boost dizi belgelerini okuyorum ve bu satırı görüyorum:

C ++ 11 kullanıyorsanız, boost :: array yerine std :: array kullanmayı düşünmelisiniz

Boost'un büyük lib'leri için her zaman standart lib'e tercih edildiği izlenimi altındaydım:

  • destek asla standart lib'den daha kötü performans göstermez
  • destek daha fazla özellik sağlayabilir
  • Destek, standart lib'den daha yüksek bir kaliteye sahiptir (C ++ standardı yazan kişiler aktif destek geliştiricileri / süpervizörleridir)
  • büyük artış özellikleri birkaç yıl sonra standart lib sonunda

Yani stdlib üzerinde destek tercih etmek doğru muyum?

Eğer daha karmaşık değilse, benim varsayımlarımdan hangileri düzeltilmelidir?


21
2018-01-15 09:50


Menşei


# 2 kesinlikle doğrudur (hemen hemen her şey "olabilir"). Uygulamada gerçek olsa bile # 1 asılsızdır. # 3 takip etmez ve aynı zamanda özneldir. # 4 olabilir veya olmayabilir, ancak her durumda bu bağlamda bir şey ifade etmez. - Jon
Bir derleyicinin sadece bir derleyici uygulaması için yazılabildiği bir derleyicinin standart lib uygulaması, çekilmesi gereken derleyici geçici dosyalarının sayısı nedeniyle, destek libs'i kullanılırken derleme süresinin daha yüksek olabileceğini buldum. - the_mandrill
İfadenin ana kısmı "C ++ 11 kullanıyorsanız" idi. Bu, anahtar, şu anda C ++ 03 kütüphanesidir. Boost'un C ++ 11 ve muhtemelen yeni bazı yeni sürümler geliştireceğinden eminim, bu yüzden destek tamamen ortadan kalkmayacak. - CashCow
@CashCow, ne yazık ki durum böyle değil. En son destek tüm özelliklerin kilidini açmak için C ++ 11 olarak derlemeyi gerektirir. - Mahmoud Al-Qudsi
# 1 sadece yanlıştır: Örnek: VS'den make_shared, o zamana kadar Boost'u kaldıran mükemmel optimizasyonlara sahiptir, daha sonra eklenmiş olabilir - NoSenseEtAl


Cevaplar:


Varsa standart lib kullanmalıyım çünkü standarttır ve derleyici ile birlikte gelir. Ayrıca, takviye kullanıyorsanız, can sıkıcı bir dış bağımlılığa ihtiyacınız vardır.

Yani, benim tavsiyem: Mümkün olduğunda std kullanın. Taşınabilir kod yazıyorsanız, bu da eski derleyiciler ile derlenmiş olmalıdır, kullanmakta olduğunuz derleyiciye göre std veya destekleyici ad alanını gömerek kendi ad alanınızı (örneğin: cxx0x) kullanmayı düşünebilirsiniz (buna ad alanı takma adı):

#ifdef COMPILER_HAS_CXX0X
    #include <memory>
    namespace cxx0x = std;
#else
    #include <boost/shared_ptr.hpp>
    namespace cxx0x = boost;
#endif

...

cxx0x::shared_ptr< MyClass > = ...

22
2018-01-15 09:57



Standart için +1! - Adri C.S.
Buna isim alanı takma adı denir. - CashCow
popüler oylama ile cevabınız kabul edilir. Teşekkürler ! - Offirmo
2013… kabul etme zamanı CXX11 - Potatoswatter
2014, yani ... CXX14 - user1284631


Kendi tecrübemden şu an için destek kullanmayı tercih ediyorum. Belki tarihseldir, ancak VC2008 ile birlikte gelen TRT'de STD girişimlerinin PJ Plauger'in en iyi çabalarına rağmen çok fazla hataya sahip olduğunu gördüm, o, geçmişten gelen hakemlik ve kontrol edilen kodun kalitesini yeniden üretemedi. Oldukça biraz tarih.

Aslında destek kodlarını alıp STD'de kullanamazlarsa, neden daha iyi üretebilirler? Elbette bazen de olabilirler ve gerçekten birbirlerine karşı değil, üzerinde birlikte çalışmalıdırlar.

Şu anda yaptığım bir şey, genellikle ad denilen bir takma ad alanı ilan etmektir spns Böylece:

namespace spns = boost;

sonra kullanabileceğim spns::shared_ptr kodum boyunca (spns "paylaşılan işaretçi ad alanı" anlamına gelir) ve eğer daha sonra std'ye geçersek tek bir yere gitmek ve sadece bu satırı ve içeriklerini düzenlemek kolay olacaktır.

C ++ 11'e gelince, Standart ve büyük harfin C ++ 03 kodunda büyük değişiklikler var. Yani şimdi tabloların kütüphanenin belirli bölümleri için dönme olasılığı vardır. Bazı desteklerin iyi kütüphanelerinin C ++ 11 için neredeyse modası geçmeyeceğini düşünüyorum. kimse kullanamaz boost::lambda Artık, sadece bir lambda için yeni dil sözdizimini kullanacaklar.

Evet, C ++ 11'e geçtiğinizde, destek kütüphanesinin bölümlerini terk etme ve yeni sürümleri kullanma zamanı gelmiş olabilir.


3
2018-01-15 10:03



mı spns Paylaşılan İşaretçi Ad Alanı için bir kısaltma? Özellik başına bir ad alanı takma adı bildirir misiniz? - mskfisher
Eğer ilgisizlerse mantıklıdır. Örneğin, akıllı işaretçiler için ve diğeri iş parçacıkları için bir kitaplık kullanabilirsiniz. - CashCow


Dan alınan artırmak insanlar kendilerini:

Neden bir kurum Boost kullanıyor?

Tek kelimeyle, Verimlilik. Kullanımı   Boost gibi yüksek kaliteli kütüphaneler   ilk gelişmeyi hızlandırır, sonuç   daha az hata, azaltır   tekerleğin yeniden düzenlenmesi ve kesmeler   uzun süreli bakım maliyetleri. Dan beri   Boost kütüphaneleri de   fiili veya de jure standartları, birçok   programcılar zaten aşina   onlar.

Boost kütüphanelerinin on tanesi   C ++ Standart Kitaplığı’na dahil   TR1, ve daha sonra dolu için dolu   standardizasyon. Daha fazla kütüphane desteği   TR2 için boru hattında. kullanma   Boost kütüphaneleri bir organizasyon sağlar   yeni kabul edilmeye başlayacak   teknolojiler.

Birçok kuruluş zaten programları kullanıyor   Adobe gibi Boost ile uygulandı   Acrobat Reader 7.0.


2
2018-01-15 09:53



+1 Her zaman örnekleri düz kelimelere tercih ederim. - SChepurin
Bu Boost kendini büyütüyor. OP'nin sorduğu gibi bir karşılaştırma yapmak için iyi bir kaynak değil. Boost'un bazı standart komiteye ilham vermesi kesinlikle doğrudur. Bir standartlaştırma gerçekleştikten sonra bile, gerçek destek en iyi seçenek olmaya devam ediyor. - Emilio Garavaglia
Ben pek çok kez destek ile büyük sıkıntı vardı. En son sürüme geçtiğinde beklenmedik çökme (ancak yalnızca Sürüm Oluşturma), düşük performans, bir şeyi nasıl uygulayacağını bilmediğinizden ve gerçekten umursamamanız gerektiğinden, vb. Çünkü, onsuz yaşayabiliyorsanız, ondan uzak durun. ve hayatın biraz daha güzel olacak. - user1764961
Boost insanlarının kendilerine Boost'u kullanmalarını önermesi, gelecekteki standart kütüphaneleri kullanmak için bir basamak taşıdır - şimdi, şimdiki zamanda! Boost, "standardı kullan" diyor gerçekten. - einpoklum


C ++ 11'e karşı geliştirilen açık kaynaklı yazılımlarda gördüğüm eğilim, STD'den API uyumlu (alt kümedeki) özelliklerin std'ye yükseltilmesidir - çünkü std özelliklerinin C ++ 11 uyumlu olmayan derleyiciler için kullanılabilir. (açıkçası) değil.

Bunun iyi bir örneği savrulun.

API uyumlu özellikler için, sadece etrafındaki ad alanlarının değiştirilmesi meselesi. Aslında, yapabileceğiniz bir konfigürasyon seçeneği yapmamak için bir sebep yok.

Kenar çubuğu: Yalnızca başlıksız destek kütüphanelerinin en son sürümüne karşı bağlantı oluşturuyorsanız, destekle derlenmedikçe belirli özelliklerin artık kullanılamayacağını önceden belirtin. -std=c++11. Son zamanlarda buradaki bazı işlevlerle çalıştım. boost::filesystem API.


1
2018-01-15 10:08





Bir şey standart olabiliyorsa standart olsun. Bir şey yapamazsa, çözümü mümkün olduğunca daha standart bir şekilde kullanın (ve BOOST bunun için tasarlandı)

Pek çok standart kütüphane özelliği, standart hale getirilmedikleri yerlerde, nerede konuşlandırıldıkları uygulamayı desteklemek için var olan destekten alınmıştır.

Standartlaştırılmış özellik için destek kullanmak aslında "geriye doğru bak" dır. Bazen gerekli (standart kütüphane özel uygulama gerekli olan her şeyi içermiyor olabilir ... std :: thread yerine std :: thread yerine std :: thread yerine bir derleyici tarafından taşınan bir std uygulaması nedeniyle) ama ben bir kural yapmazdım.


1
2018-01-15 10:14



Ahem ... Neyin üzerinde standart olduğunu tanımlamak için "tanrı" yoktur. Standart olarak kabul edilen şey her zaman “standart” olarak etiketlenmiş değildir (herkes zaten standart olduğunu iddia eder). Boost, C ++ stdlib'den daha fazla "standart" (yani daha kararlı, en iyi bilinen, daha yaygın olarak kullanılan ve kabul edilen) olarak kabul edilebilir, bu yüzden benim sorum. - Offirmo
Aslında bir "tanrı" vardır: C ++ dilinin "standart kütüphane" nin ne olduğunu ve içerdiğini tanımlayan bir özelliği vardır. Standart, belirli sorun alanlarını kapsamayabilir veya belirli uygulamaların standart altı olması diğer problemlerdir. Fakat standart C ++, iyi tanımlanmış bir ANSI komitesinden geliyor. - Emilio Garavaglia