2016-04-08 10 views
4

Schnelle und einfache Frage: ist std::bitset garantiert zusammenhängend im Speicher?Ist Bitset-Kontiguität garantiert?

Ich weiß, es bleibt durch CopyConstructible und CopyAssignable Konzepte, aber ist es auch ein ContiguousContainer (oder so ähnlich) wie std::vector?

Neben Polsterung, würde Ich mag bitweise Operationen auf Strukturen wie diese machen:

struct tmp 
{ 
    std::bitset<32> b; 
    unsigned int c; 
}; 

So ist die Kontiguität von b ganz wichtig ist. Dies führt natürlich dazu, zu wissen, ob std::bitset eine Standard-Layout-Klasse ist, so dass jede bitweise Operation funktioniert.

+0

Meinst du 'union { std :: bitset <32> b; unsigned int c; }; '? – cpplearner

+0

Nein, ist es nicht. Warum fragst du, wenn du die Antwort bereits kennst? Tipp - nur etwas, was im Standard angegeben ist, ist garantiert. – SergeyA

+0

Nein, 'struct'. Ich möchte zwei Felder im Speicher, ein 'bitset' und eine ganze Zahl. – senseiwa

Antwort

1

Es gibt keine solche Garantie. std::bitset hat meiner Erfahrung nach eine unbeholfene Schnittstelle, so dass ich nicht viel von dem Sinn sehe, es auf undefinierte Weise zu benutzen.

Schreiben Sie einfach Ihr eigenes Bitset wie Klasse mit den Layout- und Speichergarantien, die Sie benötigen.

Persönlich würde ich es genießen. Und ich finde die Schnittstelle bitset (vor allem Konstruktion/Serialisierung/Deserialisierung) nicht besonders gut, so dass ich mich nicht einmal schuldig fühlen würde. (Ich denke, eine effiziente Zählung zu schreiben, alle, alle und keine ist ein bisschen Arbeit, aber alles andere ist trivial. Und wenn Sie Assembleranweisungen schreiben/mit SSE intrinstics, könnten Sie in der Lage sein, die Implementierung Ihres Compilers irgendwie zu übertreffen)

8

Es gibt keine Anforderung in der Norm für std::bitset<>, eine bestimmte Layout- oder Bit-Reihenfolge zu haben.

Die Tatsache, dass die Anzahl der erforderlichen Bits als Template-Argument angegeben wird, impliziert, dass Speicher als ein zusammenhängender Block (ein Array-Mitglied) zugeordnet wird. Denn die Zuweisung von mehr als einem Block wäre komplexer, weniger effizient und würde keinen nützlichen Zweck haben.

Nichtsdestotrotz empfehle oder unterstütze ich nicht den Zugriff auf die interne Darstellung von std::bitset<>.

+0

Obwohl der Speicher in einem Block zugewiesen werden kann, gibt es keine gute Möglichkeit, einen Zeiger auf das erste Bit zu erhalten. Das OP beabsichtigt, bitweise Operationen direkt auf ein solches Objekt anzuwenden, so dass er implizit davon ausgeht, dass das Objekt * nur * diese Bits enthält (oder es ist egal, ob das Objekt beschädigt wird). – Aleph

+0

@Aleph True und ich empfehle oder unterstütze nicht den Zugriff auf die interne Repräsentation von 'std :: bitset'. –

+1

Nur dafür sorgen, dass das OP es nicht versucht :). – Aleph

Verwandte Themen