我们可以预测编译器如何实现C结构吗?
如果我写(非常严重对齐)结构:
struct {
uint16_t a;
uint32_t b;
uint8_t c;
} s;
char *p = (char*)&s;
Run Code Online (Sandbox Code Playgroud)
我可以保证p[6]是一样的s.c吗?结构字段是以最明显和规范的方式分配的,因此我们可以预测每个字段在内存中的位置吗?
编辑:会struct __attribute__ ((__packed__)) {...} s;在GCC中让我这样做吗?
这些字段必须按升序分配,但编译器可以根据需要在字段之间插入填充,因此无法保证nin p[n]将引用哪个值s.c.OTOH,您可以使用获得正确的偏移量offsetof(s,c).