que tengo una aplicación de C++ que incluye una serie de estructuras con campos de bits de control manual, algo así comoCómo lenta son campos de bits en C++
#define FLAG1 0x0001
#define FLAG2 0x0002
#define FLAG3 0x0004
class MyClass
{
'
'
unsigned Flags;
int IsFlag1Set() { return Flags & FLAG1; }
void SetFlag1Set() { Flags |= FLAG1; }
void ResetFlag1() { Flags &= 0xffffffff^FLAG1; }
'
'
};
Por razones obvias me gustaría cambiar esto para usar los campos de bits , algo así como
class MyClass
{
'
'
struct Flags
{
unsigned Flag1:1;
unsigned Flag2:1;
unsigned Flag3:1;
};
'
'
};
La única preocupación que tengo con hacer este cambio es que me he encontrado con una serie de referencias en este sitio que indican cómo los campos de bits son lentos en C++. Mi suposición es que todavía son más rápidos que el código manual que se muestra arriba, pero ¿hay algún material de referencia que cubra las implicaciones de velocidad de usar campos de bits en varias plataformas, específicamente ventanas de 32 bits y 64 bits? La aplicación trata con grandes cantidades de datos en la memoria y debe ser rápida y eficiente desde el punto de vista de la memoria, lo que bien podría ser el motivo por el cual se escribió de esta manera en primer lugar.
Tenga en cuenta que los campos de bit son menos portátiles. Si planea que su código se ejecute en plataformas tanto grandes como pequeñas, debe evitarlas. – Bill
Estoy de acuerdo con Bill: los campos de bits realmente son una herramienta de último recurso. No creo haberlos usado durante veinte años o más. –
@Bill, había considerado el problema de Endian, pero dado que los datos incluyen muchos otros enteros, el endian-ness será un problema con la migración entre plataformas en cualquier caso, lo más probable es que se trate durante la serialización. –