我们可以依靠C结构表现良好的格式吗?

lve*_*lla 1 c gcc

我们可以预测编译器如何实现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中让我这样做吗?

Jer*_*fin 7

这些字段必须按升序分配,但编译器可以根据需要在字段之间插入填充,因此无法保证nin p[n]将引用哪个值s.c.OTOH,您可以使用获得正确的偏移量offsetof(s,c).

  • `#include <stddef.h>`为此! (2认同)

Jos*_*hua 7

你不能.不要那样做.

您只保证订单,同一个编译器将始终执行相同的布局.

如果您需要这样的东西,请查阅编译器的文档,了解如何启用字节打包(始终可用)并自行填充.