我想用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++编译器是否可以添加额外的填充,阻止我使用它来布置我的位?
这不值得烦恼,只是让编译器告诉你它很奇怪:
static_assert(sizeof(request_header) == 24, "Unexpected packet size");
Run Code Online (Sandbox Code Playgroud)