ARM > Efficient C for ARM > Bitfields

by David Thomas on

Bitfields

  • Mini structure members.
  • Subject to pointer aliasing.
  • Layout not guaranteed.

On the whole, you’re better off using a flags word.

Example

typedef struct {
  unsigned int hasLasers   : 1;
  unsigned int hasMissiles : 1;
  unsigned int hasBomb     : 1;
  unsigned int hasECM      : 1;
} ShipData;

ShipFlags getShipFlags(const ShipData *d)
{
  return (d->hasLasers   << 0) |
         (d->hasMissiles << 1) |
         (d->hasBomb     << 2) |
         (d->hasECM      << 3);
}
getShipFlags LDR r0,[r0,#0]
             AND r0,r0,#0xf
             MOV pc,lr

Becomes:

typedef struct {
  ShipFlags flags;
} ShipData2;

ShipFlags getShipFlags2(const ShipData2 *d)
{
  return d->flags;
}
getShipFlags2 LDR r0,[r0,#0]
              MOV pc,lr