struct Monster {
uint32_t id; // 4 bytes
float x, y, z; // 12 bytes
float vx, vy, vz; // 12 bytes
int32_t hp; // 4 bytes
int32_t attack; // 4 bytes
int32_t defense; // 4 bytes
uint8_t is_alive; // 1 byte
uint8_t team; // 1 byte
char name[22]; // 22 bytes
};
In many cases 16-bit integers are enough for storing positions and velocities (with carefully tuned range). Other stats can use 16-bit or even 8-bit integers, bit-fields can be used for boolean flags and other small integer values (like team). Storing per-moster name may be not necessary unless they are not monsters but unique NPCs.The same optimization may also reduce network bandwidth for multiplayer games and save sizes for singleplayer games.
Smaller structs help with keeping working set down though.