Don't put any members after these buffers, since only the first 32 bytes of this struct can be accessed quickly using the ldd instruction

these are buffers used by interrupt service routines

on the write side, the following indicates that an arduino program will be blocked if the buffer is full until space becomes available

// If the output buffer is full, there's nothing for it other than to
// wait for the interrupt handler to empty it a bit

i believe on the receive side, data will be lost if the buffers are filled if the arduino program doesn't not check/read the serial interface often enough (32 bytes takes ~32 msec at 9600 bps)

this line of code from HardwareSerial::_rx_complete_irq suggests that by using the mod operator (%) the compiler will optimize the code to simply mask (0x1f) the buffer index to minimize processing time w/in the ISR

  rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;