Bei der Verwendung von STL-bitsets anstatt einzelne Variablen?
In welcher situation wäre es besser geeignet für mich, eine bitset (STL-container) zu verwalten eine Reihe von flags anstatt Ihnen erklärt, als eine Reihe von separaten (bool) Variablen?
Bekomme ich einen erheblichen performance-Gewinn, wenn ich eine bitset für 50 Fahnen, anstatt 50 separate bool-Variablen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, 50 bools als bitset dauert 7 bytes, während 50 bools als bools werden 50 bytes. In diesen Tagen, ist nicht wirklich eine große Sache, so mit bools ist wahrscheinlich gut.
Jedoch, einen Ort, ein bitset, könnte nützlich sein, wenn Sie brauchen, um passieren die bools, um eine Menge, vor allem, wenn Sie benötigen, geben Sie die Menge der von einer Funktion. Mit einem bitset haben Sie weniger Daten verschoben werden, um Sie auf den Stapel für die Rücksendungen. Dann wieder, Sie konnte einfach refs statt und haben sogar noch weniger Daten zu übergeben um. 🙂
std::bitset geben Ihnen zusätzliche Punkte, wenn Sie brauchen, um serialisieren /Deserialisieren es. Sie können einfach schreiben Sie es auf einem stream oder Lesen aus einem Datenstrom. Aber sicherlich, das separate bools gehen, schneller zu sein. Sie sind optimal für diese Art der Verwendung, nachdem alle, während ein bitset ist optimiert für Raum und hat immer noch die Funktion aufruft, beteiligt. Es wird nie schneller sein als der separate bools.
Bitset
op<<
undop>>
Separate bools
Entscheiden sich auf die Fakten. Ich, persönlich, würde die Verwendung
std::bitset
für einige nicht-Leistung ist kritisch, und würde bools, wenn ich entweder nur ein paar bools (und so ist es Recht-übersicht-fähig), oder wenn ich brauche, die extra-Leistung.Es hängt davon ab, was du meinst, von 'Leistungssteigerung'. Wenn Sie nur 50 von Ihnen, und du bist nicht der Arbeitsspeicher dann trennen bools ist so ziemlich immer die bessere Wahl als ein bitset. Sie nehmen mehr Speicher, aber die bools viel schneller. Ein bitset ist in der Regel implementiert werden als ein array von ints (die bools sind verpackt in die int-Werte). Also die ersten 32 bools (bits) in Ihre bitset dauert nur einen einzigen 32-bit int zu Lesen aber jeder Wert, den Sie haben zu tun, einige bitweise Operationen der ersten Maske alle Werte, die Sie nicht wollen. E. g. zu Lesen, das 2. bit von ein bitset, müssen Sie zu:
Jedoch, wenn der Speicher ist ein Flaschenhals, und Sie haben eine Menge von bools mit einem bitset könnte Sinn machen (z.B. wenn Sie die target-Plattform ist ein Handy, oder es einige Zustand in einer sehr belebten web-service)
HINWEIS: EIN std::vector bool hat in der Regel eine Spezialisierung auf die Nutzung der entspricht einem bitset, so dass es viel kleiner und auch langsamer, aus den gleichen Gründen. Also wenn Geschwindigkeit ein Problem ist, Sie werden besser mit einem Vektor von char (oder gar int), oder auch nur mit einem old-school-bool-array.
RE @Wilka:
Eigentlich bitsets werden unterstützt durch C/C++ in einer Weise, dass doesn ' T benötigen Sie, um Ihre eigene Maskierung. Ich erinnere mich nicht an die genaue syntax, aber es ist so etwas wie dieses:
Können Sie auf einen beliebigen Wert in das struct nur unter Verwendung der Punkt-notation, und die richtigen Dinge werden passieren:
Können Sie beliebige bit-Größen für die Dinge. Die resultierende Struktur kann bis zu 7 bits größer als die Daten, die Sie definieren (die Größe ist immer die minimale Anzahl von bytes benötigt, um die Daten zu speichern, die Sie definiert).