Есть ли гарантированный способ избежать заполнения между базовым и производным классом?

Я работаю над сетевой программой, которая будет работать с пакетами, имеющими часть заголовка и часть полезной нагрузки. Заголовок переменной длины с добавленными или удаленными сегментами расширения в зависимости от условий сети. Часть пользовательских данных представляет собой обычный байтовый буфер, хотя он может рассматриваться как некая структура или иная структура во время создания или использования пакета.

Я хотел бы иметь базовый класс, который строит & манипулирует заголовком с байтами заголовка (возможно), смещенными вперед или назад, если необходимо вставить поле расширения, и производным классом, содержащим пользовательские данные. Например:

class hdr {
public:
const void *start( void ) { return uint8_t(pBuf) + sizeof(pBuf) - SIZEOF_HEADER - pExtBytes; }
private:
size_t   pExtBytes;
uint32_t pBuf[16]; // header data goes here, shifted to the END of the buffer, adjacent the beginning of the derived class
// NO PADDING HERE!
} ;

class payload1 : public hdr {
public:
private:
uint8_t pData[128];
} ;

class payload2 : public hdr {
public:
private:
uint16_t pData[12];
} ;

Есть ли стандартный способ гарантия что между отступами нет hdr а также payload1 или же payload2чтобы я мог пройти start() в write() и заголовок и смежные полезные данные передаются по сети? Например, если (sizeof(hdr) % BIG_STANDARD_ALIGNMENT) == 0) затем производные классы hdr начнется без каких-либо дополнительных дополнений?

Альтернативой является использование разброса / сбора данных ввода / вывода, но это кажется сложной настройкой, и я не уверен, что она работает для сбора фрагментов пакета вместе для передачи в одном пакете UDP.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]