Sobes.tech
Junior

What are bit fields in C++?

sobes.tech AI

Answer from AI

Bit fields are a special syntax in C and C++ that allow members of structures or classes to occupy a specified number of bits instead of whole bytes. This is useful for memory saving, especially in low-level programming, working with hardware registers, or transmitting data over protocols where precise bit layout is important.

Declaration syntax:

struct BitField {
    data_type member_name : number_of_bits;
    // ... other members
};

Features:

  • The data type of the member is usually an integer (int, unsigned int, char, etc.).
  • The number of bits is specified after the colon.
  • The size of a structure with bit fields can be less than the sum of the sizes of its members declared normally.
  • The order of placement of bit fields within a word depends on the specific compiler and architecture (endianness).
  • The address (&) of a bit field cannot be obtained, as it may not start on a byte boundary.
  • Bit fields cannot be arrays or pointers.

Example:

struct StatusFlags {
    unsigned int error : 1;     // occupies 1 bit
    unsigned int ready : 1;     // occupies 1 bit
    unsigned int busy : 1;     // occupies 1 bit
    unsigned int code : 5;        // occupies 5 bits
    unsigned int reserved : 24; // occupies 24 bits (completes to 32 bits)
}; // Total size can be 4 bytes

Usage:

Access to bit fields is done like regular structure members:

StatusFlags status;
status.error = 1;
status.code = 10;

if (status.ready) {
    // ...
}

Advantages:

  • Memory saving.
  • Allows exact matching of bit data formats.

Disadvantages:

  • Portability: the order of placement and size of the structure depend on the compiler/architecture.
  • Cannot obtain the address of a bit field.
  • There may be nuances with performance when accessing individual bits.