son separacion separables saber resuelven que primer por ordinarias orden metodo las edo ecuaciones diferenciales como c++ performance bitsets

c++ - separacion - Cuándo usar los conjuntos de bits STL en lugar de variables separadas?



metodo de variables separables (4)

¿En qué situación sería más apropiado para mí usar un conjunto de bits (contenedor STL) para administrar un conjunto de indicadores en lugar de tenerlos declarados como un número de variables separadas (bool)?

¿Obtendré una ganancia de rendimiento significativa si utilicé un conjunto de bits para 50 banderas en lugar de usar 50 variables de bool separadas?


Bueno, 50 bools como bitset tomarán 7 bytes, mientras que 50 bools como bools tomarán 50 bytes. En estos días eso no es realmente un gran problema, entonces el uso de bools probablemente esté bien.

Sin embargo, un lugar en el que un bitsetset podría ser útil es si necesita pasar esos bools alrededor de un lote, especialmente si necesita devolver el conjunto desde una función. Con un conjunto de bits, tiene menos datos que se deben mover en la pila para retornos. Por otra parte, podría utilizar refs en su lugar y tener aún menos datos para pasar. :)


Depende de lo que quiere decir con ''ganancia de rendimiento''. Si solo necesita 50 de ellos, y no tiene poca memoria, bools separadas es una opción mucho mejor que un bitsetset. Tomarán más memoria, pero los bools serán mucho más rápidos. Un bitsetset generalmente se implementa como una matriz de ints (los bools se empaquetan en esas entradas). Por lo tanto, los primeros 32 bools (bits) en su conjunto de bits solo ocuparán un solo int de 32 bits, pero para leer cada valor, primero debe realizar algunas operaciones bit a bit para enmascarar todos los valores que no desea. Por ejemplo, para leer el segundo bit de un conjunto de bits, debe:

  1. Encuentre la int que contiene el bit que desea (en este caso, es la primera int)
  2. Bitwise And that int con ''2'' (es decir, valor & 0x02) para averiguar si ese bit está configurado

Sin embargo, si la memoria es un cuello de botella y tienes muchos bools usando un bitsetset podría tener sentido (por ejemplo, si tu plataforma objetivo es un teléfono móvil, o es un estado en un servicio web muy ocupado)

NOTA: Un std :: vector of bool generalmente tiene una especialización para usar el equivalente de un conjunto de bits , lo que lo hace mucho más pequeño y también más lento por las mismas razones. Entonces, si la velocidad es un problema, será mejor que uses un vector de char (o incluso int), o incluso que solo uses un conjunto de bool de la vieja escuela.


RE @Wilka:

En realidad, Bitsets son compatibles con C / C ++ de una manera que no requiere que hagas tu propia máscara. No recuerdo la sintaxis exacta, pero es algo como esto:

struct MyBitset { bool firstOption:1; bool secondOption:1; bool thirdOption:1; int fourBitNumber:4; };

Puede hacer referencia a cualquier valor en esa estructura con solo usar notación de puntos, y ocurrirán las cosas correctas:

MyBitset bits; bits.firstOption = true; bits.fourBitNumber = 2; if(bits.thirdOption) { // Whatever! }

Puede usar tamaños de bits arbitrarios para cosas. La estructura resultante puede ser hasta 7 bits más grande que los datos que define (su tamaño es siempre el número mínimo de bytes necesarios para almacenar los datos que definió).


std :: bitset le dará puntos extra cuando necesite serializar / deserializarlo. Puede simplemente escribirlo en una transmisión o leer desde una transmisión con él. Pero sin duda, los bools separados van a ser más rápidos. Después de todo, están optimizados para este tipo de uso, mientras que un conjunto de bits está optimizado para el espacio y todavía tiene llamadas a funciones involucradas. Nunca será más rápido que bools separados.

Bitset

  • Muy eficiente en el espacio
  • Menos eficiente debido al poco toqueteo
  • Proporciona serialización / deserialización con op<< y op>>
  • Todos los bits empaquetados juntos: Tendrás las banderas en un solo lugar.

Bools separados

  • Muy rapido
  • Bools no están empaquetados juntos. Serán miembros en algún lado.

Decide sobre los hechos. Yo, personalmente, usaría std::bitset para algunos que no sean críticos para el rendimiento, y usaría bools si tuviera solo algunos bools (y por lo tanto es bastante capaz de visión general), o si necesito el rendimiento adicional.