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::bitset
bir 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::bitset
kodun hemen düz C kodunu kazandığı açık değildir . Kullanımının std::bitset
kaynak 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::bitset
aş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, bitset
aynı 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ı bitset
SIMD 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::bitset
Sınırlamaları olup olmadığı konusunda iki örnek verebilirim.
- Boyutu
std::bitset
derleme zamanında bilinmelidir. Dinamik olarak seçilen boyutta bir bit dizisi yapmak için,std::vector<bool>
.
- İçin geçerli C ++ spesifikasyonu,
std::bitset
daha büyük bitset
bir 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::bitset
derleme zamanında sabitlenir. Aklıma gelen tek sakıncası bu.