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

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

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

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 начнутся без каких-либо дополнительных заполнителей?

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

...