Вернуться к пулам объектов.
Следующая гипотеза.
Если у вас будет 3 типа сообщений (A, B, C), вы можете сделать 3 массива из этих предварительно распределенных. Это создаст 3 зоны памяти A, B, C.
Не похоже, что есть только одна строка кэша, их много, и они не должны быть смежными. Некоторые строки кэша будут ссылаться на что-то в зоне A, другой B и другой C.
Таким образом, запись кольцевого буфера может иметь 1 ссылку на общего предка или интерфейс A & B & C.
Проблема заключается в выборе экземпляра в пулах; самое простое - иметь длину массива, равную длине кольцевого буфера. Это подразумевает много потраченных впустую объединенных объектов, поскольку только одна из 3-х когда-либо используется в любой записи, например: запись кольцевого буфера 1234 может использовать сообщение B [1234], но A [1234] и C [1234] не используются и не могут использоваться кем угодно.
Вы также можете создать суперпозицию со всеми 3 экземплярами A + B + C и указать тип некоторым байтом или перечислением. Точно так же расточительно по объему памяти, но выглядит немного хуже из-за жирности записи. Например, читатель, работающий только с сообщениями C, будет иметь меньшую локальность кэша.
Надеюсь, я не слишком ошибаюсь с этой гипотезой.