Забудьте о попытке сделать так, чтобы макет вашего класса. Вы будете бороться с языком C ++ весь день. Вместо этого класс, который обеспечивает доступ к двоичной структуре (в разделяемой памяти). Но сам экземпляр класса не будет в общей памяти. И диапазон байтов в совместно используемой / отображенной памяти вообще не будет объектом C ++, он просто существует в диапазоне адресов сопоставления файлов.
Предположительно длина фиксирована с момента создания? Если это так, то вы можете безопасно кэшировать длину, указатель на контрольную сумму и т. Д. В вашем объекте доступа. Так как этот кэш не находится внутри файла, вы можете хранить все, что захотите, как хотите, не заботясь о его макете. Вы даже можете использовать виртуальные функции-члены, потому что v-таблица собирается в экземпляре класса, а не в диапазоне двоичного файла.
Кроме того, учитывая, что это живет в разделяемой памяти, если есть несколько писателей, вам нужно быть очень осторожным для синхронизации между ними. Если вы просто размещаете буфер в совместно используемой / сопоставленной памяти, чтобы избежать копирования позже, но полностью перекладываете владение между процессами так, чтобы данные никогда не передавались при одновременном доступе, это будет проще. Вы также, вероятно, захотите вычислить контрольную сумму один раз после того, как все данные записаны, вместо того, чтобы пытаться поддерживать ее актуальность (и подвергать риску скачки данных в процессе) для каждой отдельной записи в буфер.