C ++ Schnelle Bitsatzkurzschlüsse Bitweise Operationen

8

Ein Demo-Problem: Bei zwei std::bitset<N> s, a und b prüfen, ob ein Bit in a und b gesetzt ist.

Es gibt zwei ziemlich offensichtliche Lösungen für dieses Problem. Das ist schlecht, weil es ein neues temporäres Bitset erstellt und alle möglichen Orte kopiert, nur um sie wegzuwerfen.

%Vor%

Diese Lösung ist schlecht, weil es ein Bit nach dem anderen geht, was weniger als ideal ist:

%Vor%

Idealerweise könnte ich so etwas machen, wobei block_type ist uint32_t oder welcher Typ auch immer bitset speichert:

%Vor%

Gibt es einen einfachen Weg, dies zu tun?

    
Travis Gockel 02.12.2011, 00:24
quelle

2 Antworten

6

Ich habe Ihr erstes Beispiel mit der Optimierung in g++ erstellt und Code erzeugt, der mit Ihrer dritten Lösung identisch ist. In der Tat, mit einem kleinen Bitset (320 Bits) hat es es vollständig entrollt. Ohne eine Funktion aufzurufen, die sicherstellt, dass der Inhalt von a und b in main unbekannt war, hat er das Ganze tatsächlich optimiert (obwohl beide alle 0 waren).

Lektion: Schreiben Sie den offensichtlichen, lesbaren Code und lassen Sie den Compiler damit umgehen.

    
Ben Jackson 02.12.2011, 00:43
quelle
0

Du sagst, dass dein erster Ansatz "Kopien aller möglichen Orte kopiert, nur um sie wegzuwerfen". Aber es gibt wirklich nur einen zusätzlichen Wert-copy (wenn das Ergebnis von operator& an any_both_new_temp zurückgegeben wird), und es kann eliminiert werden, indem eine Referenz anstelle eines Wertes verwendet wird:

%Vor%

(Aber offensichtlich wird es immer noch ein temporäres bitset erstellen und a hineinkopieren.)

    
ruakh 02.12.2011 00:42
quelle

Tags und Links