Mantıksal (teknik olmayan) bakış açısından hiçbir avantajı yoktur.
Herhangi bir düz C / C ++ kodu uygun "kütüphane yapısı" içine sarılabilir. Böyle bir sargıdan sonra, "bunun bundan daha avantajlı olup olmadığı" konusu tartışmalı bir soru haline gelir.
Bir hız bakış açısından, C / C ++, kütüphane yapısının sardığı düz kod kadar verimli kod üretmesine izin vermelidir. Ancak bu aşağıdakilere tabidir:
- İşlev satır içi
- Derleme zamanı denetimi ve gereksiz çalışma zamanı denetiminin ortadan kaldırılması
- Ölü kod ortadan kaldırılması
- Diğer birçok kod optimizasyonu ...
Bu tür teknik olmayan argüman kullanılarak, herhangi bir "eksik fonksiyon" herkes tarafından eklenebilir ve bu nedenle dezavantaj olarak sayılmaz.
Ancak, yerleşik gereksinimler ve sınırlamalar ek kodla aşılamaz. Aşağıda, boyutunun std::bitsetbir derleme zamanı sabiti olduğunu ve bu nedenle dezavantaj olarak sayılmamasına rağmen, hala kullanıcının seçimini etkileyen bir şey olduğunu iddia ediyorum .
Estetik bir bakış açısından (okunabilirlik, bakım kolaylığı vb.), Bir fark vardır.
Ancak, std::bitsetkodun hemen düz C kodunu kazandığı açık değildir . Kullanımının std::bitsetkaynak kodun insan kalitesini iyileştirip iyileştirmediğini söylemek için daha büyük kod parçalarına (bazı oyuncak örneklerine değil) bakmak gerekir .
Bit manipülasyonunun hızı kodlama stiline bağlıdır. Kodlama stili hem C / C ++ bit manipülasyonunu etkiler ve std::bitsetaşağıda açıklandığı gibi aynı şekilde uygulanabilir .
Biri kullanan kodu yazarsa operator [] bir kerede bir bit okumak ve yazmak için yazarsa, manipüle edilecek birden fazla bit varsa, bunu birden çok kez yapmak gerekir. Aynı şey C stili kod için de söylenebilir.
Bununla birlikte, bitsetaynı zamanda, diğer operatörler sahiptir operator &=, operator <<=vb bit kümesi tam genişliğine faaliyet. Temeldeki makineler genellikle aynı anda 32 bit, 64 bit ve bazen 128 bit (SIMD ile) çalışabildiğinden (aynı sayıda CPU döngüsünde), bu tür çok bit işlemlerinden yararlanmak üzere tasarlanmış kod "loopy" bit işleme kodundan daha hızlı olabilir.
Genel fikir SWAR (bir kayıt içinde SIMD) olarak adlandırılır ve bit manipülasyonları altında bir subtopiktir .
Bazı C ++ satıcıları bitsetSIMD ile 64 bit ve 128 bit arasında uygulama yapabilir. Bazı satıcılar yapamayabilir (ancak sonunda yapabilir). C ++ satıcının kitaplığının ne yaptığını bilmek gerekirse, tek yol sökme işlemine bakmaktır.
std::bitsetSınırlamaları olup olmadığı konusunda iki örnek verebilirim.
- Boyutu
std::bitsetderleme zamanında bilinmelidir. Dinamik olarak seçilen boyutta bir bit dizisi yapmak için,std::vector<bool> .
- İçin geçerli C ++ spesifikasyonu,
std::bitsetdaha büyük bitsetbir M bitinden ardışık bir N bit dilimi çıkarmak için bir yol sağlamaz .
Birincisi temeldir, yani dinamik boyutlu bit setlerine ihtiyaç duyan insanlar için diğer seçenekleri seçmeleri gerekir.
İkincisi aşılabilir, çünkü standart genişletilemez olsa bile, görevi gerçekleştirmek için bir çeşit adaptör yazabilir bitset.
Kutudan çıktığı gibi sağlanmayan belirli gelişmiş SWAR işlemleri türleri vardır std::bitset. Bu web sitesinde bu işlemler hakkında bit permütasyonları hakkında bilgi verilebilir . Her zaman olduğu gibi, bunları kendi başlarına uygulayabilirler std::bitset.
Performans tartışması ile ilgili.
Bir uyarı: Birçok insan standart kütüphaneden neden (bir şeyin) basit C tarzı kodlardan çok daha yavaş olduğunu soruyor . Burada mikrobenchmarking önkoşul bilgi tekrarlamak değil, ama ben sadece bu tavsiye var: "serbest bırakma modunda" (optimizasyon etkin) karşılaştırmak için emin olun ve kod ortadan kaldırılmadığından emin olun (ölü kod ortadan kaldırılması) veya olmak bir döngü dışına çekilir (döngü değişmez kod hareketi) .
Genel olarak birisinin (internette) mikrobenzerleri doğru yapıp yapmadığını söyleyemeyeceğimiz için, güvenilir bir sonuç elde etmenin tek yolu kendi mikrobenzer işaretlerimizi yapmak ve ayrıntıları belgelemek ve kamuoyu incelemesine ve eleştirisine sunmaktır. Başkalarının daha önce yaptıkları mikrobenzerleri yeniden yapmak zarar vermez.
std::bitsetderleme zamanında sabitlenir. Aklıma gelen tek sakıncası bu.