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:
Gibt es einen einfachen Weg, dies zu tun?
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.
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:
(Aber offensichtlich wird es immer noch ein temporäres bitset
erstellen und a
hineinkopieren.)