如果我布置我的struct的字段,所以它们不需要任何填充,那么一致的C++编译器是否可以增加额外的?

Mar*_*tin 3 c++ struct

我想用C++格式化现有二进制协议格式的数据包(我正在编写一个memcached客户端).在C中,我可以这样做:

    typedef struct {
        uint8_t magic;
        uint8_t opcode;
        uint16_t keylen;
        uint8_t extlen;
        uint8_t datatype;
        uint16_t reserved;
        uint32_t bodylen;
        uint32_t opaque;
        uint64_t cas;
    } request_header;
Run Code Online (Sandbox Code Playgroud)

在C++中,通常,编译器可以在字段之间添加填充.但是,上面的结构是经过精心布局的,因此所有内容都可以在没有填充的情况下对齐,假设n位类型只需要在n位边界上对齐.所以在C++中,根据标准,我安全吗?或者一个符合标准的C++编译器是否可以添加额外的填充,阻止我使用它来布置我的位?

Han*_*ant 6

这不值得烦恼,只是让编译器告诉你它很奇怪:

  static_assert(sizeof(request_header) == 24, "Unexpected packet size");
Run Code Online (Sandbox Code Playgroud)