有保证的方法来避免基类和派生类之间的填充吗?

时间:2018-12-25 19:18:56

标签: c++ memory-alignment struct-member-alignment

我正在研究一个网络程序,该程序将处理具有标头部分和有效负载部分的数据包。标头是可变长度的,根据网络条件添加或删除扩展段。用户数据部分是一个纯字节缓冲区,尽管在数据包构建或使用过程中可以将其视为某种结构或其他结构。

我想拥有一个基类来构建和操作标头,如果需要插入扩展字段,则标头字节(可能)向前或向后移动,以及一个包含用户数据的派生类。例如:

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];
} ;

是否有一种标准的方法来保证所获得的权益:hdrpayload1payload2之间没有填充,因此我可以通过start()write(),并且标头和连续的有效载荷已经从网络中传输出去了?例如,如果(sizeof(hdr) % BIG_STANDARD_ALIGNMENT) == 0),那么hdr的派生类将在没有任何额外填充的情况下开始吗?

一种替代方法是使用分散/聚集I / O,但这似乎是一个复杂的设置,而且我不确定它可以将数据包碎片收集在一起以在单个UDP数据包中进行传输。

0 个答案:

没有答案